C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数

news2024/9/21 16:35:24

目录

一、编写程序,输入三个字符串,比较它们的大小,并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用,并用指向函数的指针作为函数的参数。

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;//把函数返回值初始化为0
    while (*s1 && *s2 )//当字符串未结束时,执行该循环
    {
        s1++;//未比较出大小则继续比较下一位,故使指针增加1
        s2++;//未比较出大小则继续比较下一位,故使指针增加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函数获取字符串s1
    printf("请输入第二个字符串:\n");//提示用户输入第二个字符串
    fgets(s2, 100, stdin);//使用fgets函数获取字符串s2
    printf("请输入第三个字符串:\n");//提示用户输入第三个字符串
    fgets(s3, 100, stdin);//使用fgets函数获取字符串s3
    compare_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函数获取字符串s1
    printf("请输入第二个字符串:\n");//提示用户输入第二个字符串
    fgets(s2, sizeof(s2), stdin);//使用fgets函数获取字符串s2
    printf("请输入第三个字符串:\n");//提示用户输入第三个字符串
    fgets(s3, sizeof(s3), stdin);//使用fgets函数获取字符串s3
    compare_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函数获取字符串s1
    printf("请输入第二个字符串:\n");//提示用户输入第二个字符串
    fgets(s2, 100, stdin);//使用fgets函数获取字符串s2
    printf("请输入第三个字符串:\n");//提示用户输入第三个字符串
    fgets(s3, 100, stdin);//使用fgets函数获取字符串s3
    my_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 - b
	a = 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 ^ 0
	a = 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 here
	int i = 0, count = 0;
	for (i = 0; i < 32; i++)
	{
		if (n & (1 << i))
			count++;
	}
	return count;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1311968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1846_安全SPI

Grey 全部学习内容汇总&#xff1a;GitHub - GreyZhang/g_embedded: some embedded basic knowledge. 1846_安全SPI SPI是一种常见的通信方式&#xff0c;在汽车电子中比较常用。但是如果涉及到安全相关的设计&#xff0c;可能得考虑更多。而SPI协议本身没有很好的标准化&am…

福德机械:植保无人机的领航者

亲爱的读者们&#xff0c;欢迎来到福德机械的神奇世界。在这个充满活力和创新的世界里&#xff0c;我们专注于植保无人机的发展与应用&#xff0c;以实现农业现代化、智能化和高效化的目标。植保无人机&#xff0c;作为一种高效、环保和安全的农业工具&#xff0c;已经逐渐成为…

大数据----32.hbase高可用的演示

1、概述&#xff1a;Hbase的优缺点和适用场景 优点&#xff1a;HBase 底层基于HDFS存储&#xff0c;高可用、高扩展、强一致性&#xff0c;支持上亿级别数据。 10亿数据 性能测试结果 写性能&#xff1a;集群吞吐量最大可以达到70000 ops/sec&#xff0c;延迟在几个毫秒左右。…

摄影预约小程序制作实战教程

在如今的移动互联网时代&#xff0c;小程序成为了各行业推广和服务的重要工具之一。而对于摄影行业来说&#xff0c;一个专业的摄影预约小程序无疑是提高服务质量和用户体验的关键。 为了让大家更便捷地制作摄影预约小程序&#xff0c;本文将介绍一种使用【乔拓云】第三方制作平…

钉钉机器人发送表格

背景: 由于每次发送excel连接&#xff0c;不太好看&#xff0c;想着简单的表格直接用消息的方式发送在群里&#xff0c;就想着弄一个直接发送的表格信息&#xff0c;但是钉钉官网是没有的。 我估计钉钉的开发人员也没有想过&#xff0c;会有人钻空子&#xff0c;用markdown发送…

天翼云盘秒变硬盘分享

https://cloud.189.cn/web/share?codeAvUnqaj6NNza&#xff08;访问码&#xff1a;wf4r&#xff09;y 以下介绍为作者开发的单机版软件&#xff0c;可用于Windows环境中将天翼云盘挂载为本地硬盘&#xff0c;确实可以达到本地硬盘的使用感知&#xff0c;对于多终端数据副本一…

【RocketMQ】顺序消费消息实现原理分析

一、顺序消息概述 1.1、什么是顺序消息 顺序消息是指对于一个指定的 Topic &#xff0c;消息严格按照先进先出&#xff08;FIFO&#xff09;的原则进行消息发布和消费&#xff0c;即先发布的消息先消费&#xff0c;后发布的消息后消费。 1.2、顺序消息的类型 全局顺序消息 …

【网络安全】网络防护之旅 - 对称密码加密算法的实现

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《网络安全之道 | 数字征程》⏰墨香寄清辞&#xff1a;千里传信如电光&#xff0c;密码奥妙似仙方。 挑战黑暗剑拔弩张&#xff0c;网络战场誓守长。 目录 &#x1f608;1. 初识网络安…

性能提升100%、存储节约50%!猕猴桃游戏搭载OceanBase开启云端手游新篇章

近日&#xff0c;武汉灵动在线科技有限公司&#xff08;以下简称“灵动在线”&#xff09;与 OceanBase 达成合作&#xff0c;旗下品牌猕猴桃游戏的“游戏用户中心&#xff08;微信小程序&#xff09;”和“BI 分析报表业务系统“两大关键业务系统全面接入 OB Cloud 云数据库&a…

中国企业领袖年会在京举行,天雨设计左明龙应邀出席参加

12月9-11日&#xff0c;第二十一届中国企业领袖年会在中国大饭店隆重举行。本届领袖年会以“致敬长期主义”为主题&#xff0c;逾百名世界500强、中国500强和行业领军企业家受邀汇聚一堂&#xff0c;共话中国经济未来。北京天雨盛世文化传媒有限公司&#xff08;以下简称“天雨…

Ubuntu如何安装KVM

环境&#xff1a; 联想E14笔记本 Ubuntu20.04 问题描述&#xff1a; Ubuntu如何安装KVM 解决方案&#xff1a; 1.验证CPU是否支持硬件虚拟化 rootst-ThinkPad-E14:~# grep -Eoc (vmx|svm) /proc/cpuinfo 162.检查 VT 是否在 BIOS 中启用 安装 apt install cpu-checker …

软件设计师——软件工程(二)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

利用svm进行模型训练

一、步骤 1、将文本数据转换为特征向量 &#xff1a; tf-idf 2、使用这些特征向量训练SVM模型 二、代码 from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC from sklearn.m…

如何有效利用餐厅预约小程序推广餐厅品牌

随着餐饮行业竞争的加剧&#xff0c;餐厅订座预约成为了吸引顾客的一种重要方式。而微信小程序作为移动互联网的重要入口之一&#xff0c;为餐厅提供了一个方便快捷的预约平台。本文将介绍如何使用乔拓云平台等第三方小程序制作平台来开发餐厅订座预约微信小程序。 首先&#x…

jmeter,跨线程调用cookie

结构目录 一、线程组1 1、创建登录的【HTTP请求】&#xff0c;并配置接口所需参数&#xff1b; 2、创建【正则表达式提取器】&#xff0c;用正则表达式提取cookie字段&#xff1b; 3、创建【调试取样器】&#xff0c;便于观察第2步提取出的数据&#xff1b; 4、创建【BeanSh…

nodejs微信小程序+python+PHP的驾照理论模拟考试系统-计算机毕业设计推荐

从角色上分为用户和管理员两部分&#xff0c;用户功能主要是在前台&#xff0c;主要内容首页&#xff0c;注册登录&#xff0c; 模拟考试&#xff0c;论坛&#xff0c;公告信息 &#xff0c;个人中心&#xff0c;考试记录&#xff0c;错图记录等功能&#xff0c;后台部分主要给…

【Spark精讲】Spark Shuffle详解

目录 Shuffle概述 Shuffle执行流程 总体流程 中间文件 ShuffledRDD生成 Stage划分 Task划分 Map端写入(Shuffle Write) Reduce端读取(Shuffle Read) Spark Shuffle演变 SortShuffleManager运行机制 普通运行机制 bypass 运行机制 Tungsten Sort Shuffle 运行机制…

群晖(Synology)云备份的方案是什么

群晖云备份方案就是在本地的 NAS 如果出现问题&#xff0c;或者必须需要重做整列的时候&#xff0c;保证数据不丢失。 当然&#xff0c;这些是针对有价值的数据&#xff0c;如果只是电影或者不是自己的拍摄素材文件&#xff0c;其实可以不使用云备份方案&#xff0c;因为毕竟云…

Unity Mono加密解决方案

Unity Mono 是 Unity 引擎默认的脚本运行时环境&#xff0c;在游戏开发中扮演着重要的角色。Mono 由跨平台的开源 .NET 框架实现&#xff0c;它允许开发者使用 C# 等编程语言编写游戏逻辑。凭借简单易用的开发环境和高效的脚本编译速度&#xff0c;得到了众多游戏的青睐。 在 …

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion 模特假人换服装、换背景、换真人

给固定人物换背景或者换服装,需要用到一个Stable Diffusion扩展插件,就是sd-webui-segment-anything。 sd-webui-segment-anything 不仅可以做到抠图的效果,也能实现之多蒙版的效果。 什么是蒙版 图片蒙版是一种用于调节图像修改程度以及进行局部调整的工具。它通常分为四种…