• 【C】喝汽水,找单身狗问题


    在这里插入图片描述
    博客主页: XIN-XIANG荣
    系列专栏:【从0到1,C语言学习】
    一句短话:你若盛开,蝴蝶自来!
    博客说明:尽己所能,把每一篇博客写好,帮助自己熟悉所学知识,也希望自己的这些内容可以帮助到一些在学习路上的伙伴,文章中如果发现错误及不足之处,还望在评论区留言,我们一起交流进步!😊

    前言

    😽俩道比较锻炼编程思维和逻辑思维的基础题目,使用C语言实现

    一. 找单身狗

    1. 题目内容:

    一个数组中只有两个数字是出现一次,其他所有数字都出现了两次;找出这两个只出现一次的数字。

    2. 解题思路

    思路1:

    • 暴力求解,将数组中的每个数字与数组中的所有数字比较一次,并记录数组中的数字与其相等的次数,如果相等的次数为1,便是只出现一次的数字。

    思路2

    • 找出一个只出现过一次的数字的问题处理方法就是找一个数字把里面所有的数字都异或一遍,相同的数字异或结果为0,所以把所有的数字都异或在一起得到的结果就是仅有的俩个不同的数字异或的结果。
    • 得到的这个结果肯定不是0(要不然就全都配对了),所以里面一定至少有一个二进制位是1。
    • 找出值为1的这一位,以这一位的值将结果分为两组,值为1的分为一组,值为0的分为一组,分组后这俩个数字在各自的组中只有一个单独的数字。
    • 所以分别将俩组中的数字异或在一起,便可得到这俩个单独的数字

    3. 代码实现

    //方法一
    #include
    int main()
    {
    	int arr[] = { 1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,7,9,10 };
    	int count = 0;
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int i = 0;
    	int j = 0;
    	for (i = 0; i < sz; i++)
    	{
    		for (j = 0, count = 0; j < sz; j++)
    		{
    			if (arr[i] == arr[j])
    			{
    				count++;
    			}
    		}
    		if (count == 1)
    		{
    			printf("%d ", arr[i]);
    		}
    	}
    	printf("\n");
    	return 0;
    }
    
    
    //方法二
    #include
    
    void Find_single_num(int arr[], int sz, int* num1, int* num2)
    {
    	int i = 0;
    	int ret = 0;
    	//首先将所有数字异或
    	for (i = 0; i < sz; i++)
    	{
    		ret ^= arr[i];
    	}
    	//找出异或后的结果第几位出现1
    	int pos = 0;
    	for (pos = 0; pos < 32; pos++)
    	{
    		if (((ret >> pos) & 1) == 1)
    		{
    			break;
    		}
    	}
    	//分组异或
    	for (i = 0; i < sz; i++)
    	{
    		if (((arr[i] >> pos)&1) == 1)
    		{
    			*num1 ^= arr[i];
    		}
    		else
    		{
    			*num2 ^= arr[i];
    		}
    	}
    }
    
    int main()
    {
    	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int num1 = 0;
    	int num2 = 0;
    	
    	Find_single_num(arr, sz, &num1, &num2);
    	printf("%d %d\n", num1, num2);
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    二. 喝汽水

    1. 题目内容:

    喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水。

    2. 解题思路

    思路1:

    • 20元首先可以喝20瓶,此时手中有20个空瓶子
    • 在20瓶的基础上加上空瓶换的汽水数数即可,每次的空瓶数/2是可兑换的汽水数
    • 两个空瓶子可以喝一瓶,喝完之后,空瓶子剩余:empty/2(两个空瓶子换的喝完后产生的瓶子) + empty%2(不够换的瓶子)
    • 如果瓶子个数超过1个,可以继续换,即重复2

    思路2:

    • 按照上述喝水和用瓶子换的规则的话,可以发现,其实就是个等差数列:money*2-1

    3. 代码实现

    //方法一:
    #include
    int main()
    {
    	int money = 0;
    	int total = 0;
    	int empty = 0;
    
    	scanf("%d", &money);
    
    	total = money;
    	empty = money;
    	while (empty > 1)
    	{
    		total += empty / 2;
    		empty = empty / 2 + empty % 2;
    	}
    
    	printf("total = %d\n", total);
    	return 0;
    }
    
    
    //方法二
    #include
    int main()
    {
    	int money = 0;
    	int total = 0;
    	int empty = 0;
    
    	scanf("%d", &money);
    
    	if (money <= 0)
    	{
    		total = 0;
    	}
    	else
    	{
    		total = money * 2 - 1;
    	}
    	printf("total = %d\n", total);
    
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    结语

    各位小伙伴,看到这里就是缘分嘛,希望我的这些内容可以给你带来那么一丝丝帮助,可以的话三连支持一下呗😁!!! 感谢每一位走到这里的小伙伴,我们可以一起学习交流,一起进步😉!!!加油🏃!!!

    img

  • 相关阅读:
    git使用笔记
    Vue Router的介绍
    Linux——文件系统inode与软硬链接
    04-开发自己的npm包及发布流程详细讲解
    redis.conf文件下载与配置
    毕业设计-基于机器视觉的颜色目标识别
    【JAVA版本】websocket获取B站直播弹幕——基于直播开放平台
    c#反射(Reflection)
    【Java 进阶篇】MySQL 数据控制语言(DCL):管理用户权限
    基于SSM框架的校园疫情防控健康打卡系统
  • 原文地址:https://blog.csdn.net/Trong_/article/details/125998895