C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数
目录
一、编写程序,输入三个字符串,比较它们的大小,并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用,并用指向函数的指针作为函数的参数。
1.不使用函数指针作为参数,并自己模拟strcmp。
2、不使用函数指针作为参数,使用strcmp
3、使用函数指针作为参数进行比较
4、使用指针数组存储字符串后比较
二、一道变态的面试题不能创建临时变量(第三个变量),实现两个整数数的交换
1、一般法(不符合)
2、加减法
3、异或
三、统计二进制中1的个数
思路一:
思路二:
思路三
思路四:
一、编写程序,输入三个字符串,比较它们的大小,并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用,并用指向函数的指针作为函数的参数。

1.不使用函数指针作为参数,并自己模拟strcmp。
compare_s函数:
-
此函数的目的是比较两个字符串s1和s2的大小。
-
使用while循环逐个字符地比较两个字符串,直到其中一个字符串结束或找到不同的字符。
-
如果两个字符串的某个字符不相等,则返回它们的差值,确定它们的大小关系。
-
如果两个字符串完全相同,则返回0。
compare_output函数:
-
此函数的目的是根据compare_s函数的比较结果对三个字符串s1、s2和s3进行排序。
-
首先,它确保s1是三个字符串中最大的,然后确保s2是次大的,最后确保s3是最小的。
-
为了交换字符串,它使用了一个临时字符串s。
int compare_s(char* s1, char* s2)//定义比较字符串大小的函数
//模拟实现strcmp
{int i = 0;//把函数返回值初始化为0while (*s1 && *s2 )//当字符串未结束时,执行该循环{s1++;//未比较出大小则继续比较下一位,故使指针增加1s2++;//未比较出大小则继续比较下一位,故使指针增加1}return *s1 - *s2;//返回比较结果
}
void compare_output(char* s1, char* s2, char* s3)
{char s[N];//定义一个字符型数组充当临时字符串//以下分析了三个字符串所有的大小关系并重新排列if (compare_s(s1, s2) < 0)//确保s1>=s2{strcpy(s, s1); strcpy(s1, s2); strcpy(s2, s);//保证s1>s2}if(compare_s(s1, s3) < 0)//确保s1>=s3{strcpy(s, s1); strcpy(s1, s3); strcpy(s3, s);//保证s1>s3}if (compare_s(s2, s3) < 0)//确保s2>=s3{strcpy(s, s2); strcpy(s2, s3); strcpy(s3, s);//保证s2>s3}
}
int main()
{char s1[N], s2[N], s3[N];//定义两个字符串printf("请输入第一个字符串:\n");//提示用户输入第一个字符串fgets(s1, 100, stdin);//使用fgets函数获取字符串s1printf("请输入第二个字符串:\n");//提示用户输入第二个字符串fgets(s2, 100, stdin);//使用fgets函数获取字符串s2printf("请输入第三个字符串:\n");//提示用户输入第三个字符串fgets(s3, 100, stdin);//使用fgets函数获取字符串s3compare_output(s1, s2, s3);printf("从小到大:\n%s%s%s", s3, s2, s1);return 0;
}
2、不使用函数指针作为参数,使用strcmp
void compare_output(char* s1, char* s2, char* s3)
{char s[N];//定义一个字符型数组充当临时字符串//以下分析了三个字符串所有的大小关系并重新排列if (strcmp(s1, s2) < 0){strcpy(s, s1); strcpy(s1, s2); strcpy(s2, s);//保证s1>s2}if(strcmp(s1, s3) < 0){strcpy(s, s1); strcpy(s1, s3); strcpy(s3, s);//保证s1>s3}if (strcmp(s2, s3) < 0){strcpy(s, s2); strcpy(s2, s3); strcpy(s3, s);//保证s2>s3}
}
int main()
{char s1[N], s2[N], s3[N];//定义两个字符串printf("请输入第一个字符串:\n");//提示用户输入第一个字符串fgets(s1, sizeof(s1), stdin);//使用fgets函数获取字符串s1printf("请输入第二个字符串:\n");//提示用户输入第二个字符串fgets(s2, sizeof(s2), stdin);//使用fgets函数获取字符串s2printf("请输入第三个字符串:\n");//提示用户输入第三个字符串fgets(s3, sizeof(s3), stdin);//使用fgets函数获取字符串s3compare_output(s1, s2, s3);printf("从小到大:\n%s%s%s", s3, s2, s1);return 0;
}
3、使用函数指针作为参数进行比较
void swap(char* s1, char* s2)//交换两个字符串的值
{char s[N];strcpy(s, s1); strcpy(s1, s2); strcpy(s2, s);
}void my_sort(char* s1, char* s2, char* s3, void (*swap)(char* s1, char* s2))
{char s[N];if (strcmp(s1, s2) < 0){swap(s1, s2);//保证s1>s2}if (strcmp(s1, s3) < 0){swap(s1, s3);//保证s1>s3}if (strcmp(s2, s3) < 0){swap(s2, s3);//保证s2>s3}
}int main()
{char s1[N], s2[N], s3[N];//定义两个字符串printf("请输入第一个字符串:\n");//提示用户输入第一个字符串fgets(s1, 100, stdin);//使用fgets函数获取字符串s1printf("请输入第二个字符串:\n");//提示用户输入第二个字符串fgets(s2, 100, stdin);//使用fgets函数获取字符串s2printf("请输入第三个字符串:\n");//提示用户输入第三个字符串fgets(s3, 100, stdin);//使用fgets函数获取字符串s3my_sort(s1, s2, s3,swap);printf("从小到大:\n%s%s%s", s3, s2, s1);return 0;
}
4、使用指针数组存储字符串后比较
#include <stdio.h>// 比较两个字符串前后顺序
int compare(const char *str1, const char *str2) {while (*str1 && (*str1 == *str2)) {str1++;str2++;}return *str1 - *str2;
}// 交换两个字符串的位置
void swap(char **str1, char **str2) {char *temp = *str1;*str1 = *str2;*str2 = temp;
}// 使用指向函数的指针来排序字符串数组
void sortStrings(char **strings, int n, int (*compare)(const char*, const char*)) {int i, j;for (i = 0; i < n-1; i++) {for (j = 0; j < n-i-1; j++) {if (compare(strings[j], strings[j+1]) > 0) {swap(&strings[j], &strings[j+1]);}}}
}int main() {char str1[100], str2[100], str3[100];// 输入三个字符串printf("请输入第一个字符串:");scanf("%s", str1);printf("请输入第二个字符串:");scanf("%s", str2);printf("请输入第三个字符串:");scanf("%s", str3);// 定义一个指针数组,保存三个字符串的地址char *strings[] = {str1, str2, str3};int n = sizeof(strings) / sizeof(strings[0]);// 使用指向函数的指针来排序字符串数组sortStrings(strings, n, compare);// 输出排序后的字符串数组printf("排序后的字符串数组:\n");for (int i = 0; i < n; i++) {printf("%s\n", strings[i]);}return 0;
}
二、一道变态的面试题
不能创建临时变量(第三个变量),实现两个整数数的交换
1、一般法(不符合)
int main()
{int a = 3, b = 5;//交换a和b的值//一般法int c = a;a = b;b = c;printf("%d\n", a);printf("%d\n", b);return 0;}
2、加减法
int main()
{int a = 3, b = 5;//加减法a = a + b;b = a - b; //b = a + b - ba = a - b;这种写法的缺陷:a,b非常大,求和超过整型的最大值printf("%d\n", a);printf("%d\n", b);return 0;}
3、异或
异或操作符的特点:
a^a = 0
0^a = a
int main()
{int a = 3, b = 5;//异或a = a ^ b;b = a ^ b; //b = a ^ b ^ b = a ^ 0a = a ^ b;printf("%d\n", a);printf("%d\n", b);return 0;}
三、统计二进制中1的个数
二进制中1的个数_牛客题霸_牛客网

思路一:
循环进行以下操作,直到n被缩减为0:
1. 用该数据模2,检测其是否能够被2整除
2. 可以:则该数据对应二进制比特位的最低位一定是0,否则是1,如果是1给计数加1
3. 如果n不等于0时,继续1
int NumberOf1(int n)
{int count = 0;while(n){if(n%2==1)count++;n = n/2;}return count;
}
上述方法缺陷:进行了大量的取模以及除法运算,取模和除法运算的效率本来就比较低。
思路二:
一个int类型的数据,对应的二进制一共有32个比特位,可以采用位运算的方式一位一位的检测,具体如下
int NumberOf1(unsigned int n)
{int count = 0;int i = 0;for(i=0; i<32; i++){if(((n>>i)&1) == 1)count++;}return count;
}
思路二优点:用位操作代替取模和除法运算,效率稍微比较高
缺陷:不论是什么数据,循环都要执行32次
思路三
采用相邻的两个数据进行按位与运算
int NumberOf1(unsigned int n)
//把有符号当成无符号数
{int count = 0;while (n){count++;n = n & (n - 1);//效果:把二进制中最右边的1去掉了//n = 15//1111 - n 1110 - n-1//1110 - n 1101 - n-1//1100 - n 1011 - n-1//1000 - n 0111 - n-1//0000 - n}return count;
}
可以观察下:此种方式,数据的二进制比特位中有几个1,循环就循环几次,而且中间采用了位运算,处理起来比较高效

思路四:
1 << i;
依次顺序移动遍历二进制中的每一位
通过这种左移操作,我们可以生成一个只在第i位上为1的数字,其他位都为0。例如:
-
i=0: 0001
-
i=1: 0010
-
i=2: 0100
-
i=3: 1000
-
... 以此类推
int NumberOf1(int n) {// write code hereint i = 0, count = 0;for (i = 0; i < 32; i++){if (n & (1 << i))count++;}return count;
}
今天就先到这了!!!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
相关文章:
C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数
目录 一、编写程序,输入三个字符串,比较它们的大小,并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用,并用指向函数的指针作为函数的参数。 1.不使用函数指针作为参数,并自己模拟strcmp。 …...
module ‘tensorflow‘ has no attribute XXX 报错解决
问题描述: 粘了别人的tensorflow项目,运行总是报错module ‘tensorflow’ has no attribute什么什么 问题解决: 导入tensorflow的代码如下 import tensorflow as tf此时,某个某块报错,比如下面这个 那么就直接把tf.…...
MySQL数据库 DDL
目录 一、DDL 二、操作数据库 三、操作表 四、数据类型 五、表操作案例 六、修改表 七、删除表 一、DDL Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) 。 二、操作数据库 (1&am…...
力扣二叉树--总结篇(2)
前言 总体回顾:11.18-12.14,中间有一个星期左右因为考试没有写题。37道题。 内容 这是第二阶段刷的题 从路径到构造二叉树,合并二叉树,再到二叉搜索树,公共祖先问题 看到二叉树,看到递归 都会想&#…...
小米移动端页面练习---重点:导航栏点击下箭头内容的切换以及样式,高亮显示的实现
效果图 1.html <div><header><div class"header-ad"><img src"./images/ad.png" alt"" srcset""></div><div class"header-two-section"><div class"logo"><div c…...
从零开始创建一个项目,springBoot+mybatisPlus+mysql+swagger+maven
一,前提 从零开始创建一个项目,绑定了数据库 用到的技术栈:springBootmybatisPlusmysqlswaggermaven 二,创建项目步骤 1,创建项目 创建出来的项目结构如图所示 2,修改配置文件 因为我比较习惯yml语言&…...
【视点合成】代码解读:生成demo视频
变换工具 def render_3dphoto(src_imgs, # 输入的源图像,维度为 [batch_size, 3, height, width]mpi_all_src, # 输入的所有源图像的MPI,维度为 [batch_size, num_planes, 4, height, width]disparity_all_src, # 所有源图像的视差信息&…...
Process On在线绘制流程图
目录 一.ProcessOn 1.1.介绍 1.2.直接网上使用 二.绘制门诊流程图 三.绘制住院流程图 四.绘制药库采购入库流程图 五.绘制OA会议流程图 今天就到这里了哦!!!希望能帮到你哦!!! 一.ProcessOn 1.1.介绍 ProcessOn(流程&#…...
【Hadoop-OBS-Hive】利用华为云存储对象 OBS 作为两个集群的中间栈 load 文件到 Hive
【Hadoop-OBS-Hive】利用华为云存储对象 OBS 作为两个集群的中间栈 load 文件到 Hive 1)压缩文件2)上传文件到 OBS 存储对象3)crontab 定时压缩上传4)从 obs 上拉取下来文件后解压缩5)判断对应文件是否存在6࿰…...
直线检测算子
hough_lines_dir 接口 hough_lines_dir(ImageDir : HoughImage, Lines : DirectionUncertainty, AngleResolution, Smoothing, FilterSize, Threshold, AngleGap, DistGap, GenLines : Angle, Dist) 参数 in: ImageDir :由边缘检测算子sobel_dir、edge_image获取的…...
如何在本地Docker中部署MinIO服务并实现远程访问管理界面
文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…...
逛商场。。。
题目名字 逛商场 题意 见到想买的物品,只要能买得起,就一定会买下来之后才会继续往前走;如果买不起就直接跳过 思路 接着,它读取数组 aa 的值,并存储在数组中。然后,程序读取一个整数 m。初始化计数器 cn…...
RTrPPG
研究背景 心率 (HR) 和脉搏率变异性 (PRV) 是允许分析心脏行为的两个生理参数。心率监测可以通过接触式和非接触式的两种方法进行。通常用于测量 HR 和 PRV 的两种接触式技术是心电图 (ECG) 和光电容积脉搏波 (PPG)。 ECG 测量由心脏活动引起的电场。另一方面,PPG …...
web应用开发技术的一些概念
一、Servlet 1.Servlet的工作过程: Servelt的工作流程示意图 (1)客户端发起一个Http请求到服务器,请求特定的资源或者是要执行特定的操作 (2)服务器在接收到请求后,根据请求相应的URL将请求分发…...
智能优化算法应用:基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.乌燕鸥算法4.实验参数设定5.算法结果6.参考文…...
超聚变服务器(原华为服务器)网站模拟器
一、超聚变服务器(原华为服务器)网站模拟器: 原来了解服务器可以从他的网站上进行了解,模拟器做的很好了。 https://support.xfusion.com/server-simulators/ 有很多的模拟器,今天主要看下BMC的设置 有很多的在线工具…...
Linux常见压缩指令小结
为什么需要压缩技术 我们都知道文件是以byte作为单位的,如果我们的文件仅仅在低位占一个1 0000 0001这种情况我们完全可以压缩一下,将高位的0全部抹掉即可。 如上所说是一种压缩技术,还有一种就是将1111(此处省略96个)一共100个1࿰…...
OpenSSL的源码在哪里下载?
官方网站去下载,网址: https://www.openssl.org/source/ 比较老的版本的下载页面地址: https://www.openssl.org/source/old/ 由于某面板的OpenSSL模块的安装配置语句如下: --with-openssl/root/rpmbuild/BUILD/openssl-1.0.2u所…...
使用create-react-app脚手架创建react项目
文章目录 1、安装create-react-app脚手架2、创建 React 项目,项目名为 react-demo3、项目创建成功4、使用vscode打开项目并运行5、项目运行成功node_modules:存放项目所依赖的一些第三方包文件public:静态资源文件夹src:源码文件夹其它文件 1…...
【网络安全】网络防护之旅 - 点燃网络安全战场的数字签名烟火
🌈个人主页:Sarapines Programmer🔥 系列专栏:《网络安全之道 | 数字征程》⏰墨香寄清辞:千里传信如电光,密码奥妙似仙方。 挑战黑暗剑拔弩张,网络战场誓守长。 目录 😈1. 初识…...
别再手动调顺序了!用Vue3+Element Plus+Sortable.js给你的表格加个拖拽编辑弹窗(附完整代码)
Vue3Element PlusSortable.js打造高交互表格编辑弹窗实战 后台管理系统开发中,表格数据的顺序调整和字段管理一直是高频痛点。传统方案往往需要反复点击"上移/下移"按钮或填写表单参数,操作繁琐且体验割裂。本文将带你实现一个弹窗内一站式拖…...
MySQL存储图片旋转元数据的最佳实践
MySQL存储图片旋转元数据的最佳实践 1. 引言 在日常应用中,我们经常遇到这样的场景:用户上传的图片在显示时方向不正确,需要根据EXIF信息中的旋转角度进行自动校正。比如手机拍摄的照片,由于设备方向不同,可能包含90…...
ChatGPT背后的秘密武器:一文读懂RLHF如何让大模型更懂人类
ChatGPT背后的秘密武器:一文读懂RLHF如何让大模型更懂人类 当你向ChatGPT提问时,是否曾惊叹于它回答的流畅性和准确性?这背后隐藏着一项关键技术——基于人类反馈的强化学习(RLHF)。这项技术正在重塑我们与AI交互的方式…...
2025年阿里云幻兽帕鲁联机服务器极速搭建指南
1. 为什么选择阿里云搭建幻兽帕鲁服务器? 最近很多朋友问我,为什么非要选择阿里云来搭建幻兽帕鲁的联机服务器?作为一个从游戏测试阶段就开始折腾服务器搭建的老玩家,我总结了几个关键原因。首先,阿里云的游戏服务器专…...
GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事
GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事 你有没有过这样的经历?面对一张精心拍摄的照片,却怎么也憋不出几句像样的文案。或者,看着一张充满故事感的图片,脑海里思绪万千,落到笔尖却…...
Qwen3-4B Instruct-2507实际作品:用户说‘我要创业’→商业计划书框架生成
Qwen3-4B Instruct-2507实际作品:用户说‘我要创业’→商业计划书框架生成 1. 引言:当创业想法遇到AI助手 “我要创业!” 这句话背后,往往是一个激动人心的想法,但随之而来的是一连串的现实问题:我的商业…...
PCB设计中孔间距的DFM隐患,你避开了吗?
1. PCB孔间距设计:你可能忽略的定时炸弹 刚入行那会儿,我总觉得PCB设计就是把线路连通就行,直到亲眼看到产线上因为孔距问题报废的第三批板子——密密麻麻的破孔像蜂窝煤,有的孔边缘铜箔直接翘起来短路。老师傅指着板子说…...
如何通过Superalgos教育模块快速掌握算法交易:新手入门完整指南
如何通过Superalgos教育模块快速掌握算法交易:新手入门完整指南 【免费下载链接】Superalgos Superalgos/Superalgos: 是一个开源的分布式社交网络分析和数据挖掘平台。适合对大数据分析、机器学习、区块链以及分布式系统有兴趣的开发者。 项目地址: https://gitc…...
从Blender到虚幻引擎:除了FBX,试试GLTF格式导入的完整流程与优势对比
从Blender到虚幻引擎:GLTF格式导入的完整流程与优势解析 在三维内容创作领域,Blender与虚幻引擎的组合已经成为许多专业团队的标准工具链。当我们需要将精心制作的模型从Blender迁移到虚幻引擎时,传统的FBX格式虽然广为人知,但GLT…...
GEO 优化系统实战指南:从架构设计到算法落地
1. GEO优化系统架构设计实战 第一次接触GEO优化系统时,我被各种空间计算概念搞得晕头转向。直到真正动手搭建系统才发现,架构设计就像搭积木,只要掌握关键模块的组装逻辑,就能构建出稳定高效的地理优化引擎。下面分享我在多个项目…...
