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. 初识…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...