编程语言
首页 > 编程语言> > C语言:三道有趣的算法题

C语言:三道有趣的算法题

作者:互联网

C语言:三道算法题

文章目录

(1)交换两个整型变量的值,不能使用第三个变量

#include<stdio.h>
int main()
{
	//交换两个变量的值,不能使用第三个变量
	int x = 3;
	int y = 5;
	printf("交换前:x=%d,y=%d\n", x, y);

	//算法一:相加相减
	//缺点:如果参与运算的数很大,会溢出,整型溢出
	x = x + y; // 3 + 5 = 8
	y = x - y; // 8 - 5 = 3
	x = x - y; // 8 - 3 = 5

	//算法二:按位异或
	//优点:不会溢出
	// x = 011, y = 101
	x = x ^ y; // 3 ^ 5 = 011 ^ 101 = 110
	y = x ^ y; //         110 ^ 101 = 011 = 3
	x = x ^ y; //         110 ^ 011 = 101 = 5

	printf("交换后:x=%d,y=%d\n", x, y);
	return 0;
}

在企业开发里面:最常使用引入第三变量的方法,可读性强,效率高


(2)找出只出现一次的数

给定一个非空整型数组,除了某个元素只出现一次以外,其余每个元素均出现两次,找到那个只出现一次的元素

1)算法一:

遍历整个数组,统计各元素出现的次数,打印出现一次的元素

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4 };

	int size = sizeof(arr) / sizeof(arr[0]);  // 求数组长度
	
	int i = 0, j = 0;
	for (i = 0; i < size; i++)  // 遍历数组
	{
		int count = 0; // 统计各元素出现的次数
		for (j = 0; j < size; j++)
		{
			if (arr[i] == arr[j])
				count++;
		}
		if (count == 1)
		{
			printf("只出现一次的数:%d\n", arr[i]);
			break;
		}
	}
	return 0;
}

2)算法二:

按位异或,把所有数组元素异或在一起 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 1 ^ 2 ^ 3 ^ 4 = 5

时间复杂度: O ( N ) O(N) O(N)

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4 };

	int size = sizeof(arr) / sizeof(arr[0]);  // 求数组长度
	
	int i = 0;
	int ret = 0;  // 记录异或结果
	for (i = 0; i < size; i++)
	{
		ret ^= arr[i];
	}
	printf("只出现一次的数:%d\n", ret);
	return 0;
	return 0;
}

(3)程序运行,你的电脑在1分钟后关机,如果输入:我是猪,就取消关机

#include<stdio.h>
#include<string.h>  // strcmp
#include<stdlib.h>  // system

int main()
{
	char input[20] = { 0 };
	
	// int system(const char * command)
	// 函数功能:执行 dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数字符串command为命令名
	system("shutdown -s -t 60");  // 执行关机命令

again:
	printf("电脑将在一分钟内关机,请输入“ 我是猪 ”,取消关机\n");
	scanf("%s", input);
	if(strcmp(input,"我是猪") == 0)
	{
		system("shutdown -a");  // 取消关机命令
	}
	else
	{
		goto again;  // 跳回某处继续执行
	}

	return 0;
}

标签:关机,arr,return,int,三道,C语言,算法,include
来源: https://blog.csdn.net/weixin_48025315/article/details/122026694