目录:
一、两数交换的多种方法
二、比较两数大小的多种方法
三、在重复的数字中找出不同的数字
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。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .