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