C语言例题总结一

目录:

一、两数交换的多种方法

二、比较两数大小的多种方法

三、在重复的数字中找出不同的数字

1.在重复的数字中找出一个不同的数字

2.在重复的数字中找出两个不同的数字

一、两数交换的多种方法 

第一种:引入第三方变量(利用了指针将地址传进去)

void fun1(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}
int main() {
	int a = 10,b=20;
	fun1(&a, &b);
	printf("%d,%d", a, b);
}

第二种:不引用第三方变量,这里减法,乘法,除法都可以
a=a-b;b=a+b;a=b-a;
a=a*b;b=a/b;a=a/b;
a=a/b;b=a*b;a=b/a;

int main() {
	int a = 10;
	int b = 20;
    a = a - b;
	b = a + b; 
	a = b - a;
	printf("%d,%d", a, b);
}

但是四则运算存在的一些问题:

1.a和b不能出现0(针对乘法和除法)

2.代码没有使用第三方变量直观

3.可能存在数据溢出的问题

第三种:用二进制中的异或方法

a=a^b;b=a^b;a=a^b;

int main() {
	int a = 10;
	int b = 20;
	a = a ^ b; 
	b = a ^ b;
	a = a ^ b;
	printf("%d,%d", a, b);
}

但是如果使用异或法,也存在一个问题:不能出现浮点值(浮点值不能进行位运算)

第四种方法:直接对a,b进行内存交换

这里用到了memcpy库函数,目的是将a,b的内存进行交换(注意引用头文件#include<string.h>)

void fun(double* a, double* b) {
	char temp[10];
	memcpy(temp, a, sizeof(*a));//a的内存给temp
	memcpy(a, b, sizeof(*b));
	memcpy(b, temp, sizeof(*a));
}
int main() {
	double a = 10.0;
	double b = 20.0;
	fun(&a, &b);
	printf("%f,%f", a, b);
}

 二、比较两数大小的多种方法

第一种:选择—分支结构,if-else  switch-case

int main() {
	int a = 20;
	int b = 10;
	if (a > b) {
		printf("%d", a);
	}
	else {
		printf("%d", b);
	}
}
int main() {
	int a =10;
	int b =20;
	switch(a>b)
	{
	case 0:printf("%d", b); break;
	case 1:printf("%d", a); break;
	}
} 

第二种方法:三目运算符

int main() {
	int a =10;
	int b =20;
	int res = a > b ? a : b;
	printf("%d", res);
} 

第三种方法:用数学的思维求出最大值(abs求两数的差值,相当于数学中求出绝对值)

int main() {
	int a =10;
	int b =20;
	int res = ((a + b) +abs(a-b)) / 2;
	printf("%d", res);
} 

三、在重复的数字中找出不同的数字 

1.在重复的数字中找出一个不同的数字

(这道题的思路是用异或的方法,我们知道0与任何一个数异或都为任何一个数,而两个相同的数异或确为0),于是我们将思路用代码进行实现

int fun(int *arr,int len) {
    int n = 0;
    for (int i = 0; i < len; i++) {
        n = arr[i] ^ n;
    }
    return n;
}
int main() {
    int arr[] = { 45,32,68,32,45 };
    int len = sizeof(arr) / sizeof(arr[0]);
    int res = fun(arr, len);
    printf("%d", res);
}

2.在重复的数字中找出两个不同的数字

这道题的思路是在上面代码操作进行结束后,我们并没有得到我们想要的结果,于是我们应该想到两个数异或出来的结果“1”是代表两个数的不同位,那我们就根据他们的这一位不相同,将他们分成两个组,其他数据与这个为相“&”,就得到两组不同的数据了,最后将这两组中的数据分别异或就可以了,接下来我们进行代码的实现

int main() {
	int arr[] = { 45,32,68,19,32,45 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int num1 = 0;
	int num2 = 0;
	int index = 1;
	int n = 0;
	for (int i = 0; i < len; i++) {
		n = arr[i] ^ n;
	}
	while ((n & index) != 1) {
		index =index<<1;
	}
	for (int i = 0; i < len; i++) {
		if ((index & arr[i]) == 1) {
			num1 = num1 ^ arr[i];
		}
		else {
			num2 = num2 ^ arr[i];
		}
	}
	printf("%d,%d", num1, num2);
}

运行结果:

19,68
D:\c程序\p2-2\Debug\p2-2.exe (进程 12860)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡蓝色的经典

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值