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. 初识…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
