void Swap(int *x, int *y)
{
int a;
a= *x;
*x = *y;
*y = a;
}
一般都大家写指交换都会引用另一个变量通过值传递来交换。但其实还有其他的发现,当不可以引用其他的量的时候,a=a+b;b=a-b;a=a-b;类似的*乘法就同样完成了值的交换。但是这种方式是有弊端的,比如,当a,b很大时,这样写,有可能会导致a=a+b的时候a的值越界。所以我们还有一个方式。a=a^b;b=a^b;a=a^b;" ^ "异或标识符,对二进制序列操作。
同样的当我们求几个值的最大大值,一般的操作是定一个max=0;但是这种情况在全是负数的时候,显然出错误了,我们便假定第一个元素最小,然后用之后的和它进行比较即可。
printf("***********************10 个整数中最大值。\n");
{
int n[10];
printf("请依次输入十个值(空格隔开):");
for (int i = 0; i < 10; i++)
scanf_s("%d", &n[i]);
int max = n[0];
for (int i = 0; i < 10; i++)
//if (max < n[i])max = n[i];
max = max > n[i] ? max : n[i];
printf("max=%d\n", max);
}
当比较很多数,让他们按顺序(从大到小)输出时,可以使用两层for循环嵌套完成。但当数目较小时,swap(x1,x2);swap(x1,x3);swap(x2,x3);即可;
printf("******************三个数从大到小输出\n");
{
int n[6];
printf("请输入六个数:");
for (int i = 0; i < 6; i++)
scanf_s("%d", &n[i]);
for (int i = 0; i < 6; i++)
for (int j = 0; j < 6 - i; j++)
if (n[j] < n[j + 1])Swap(n + j, n + j + 1);
}
类似的,当我们求两个数的最大公约数时,按着数学思想,有辗转相除法;
printf("********************两个数的最大公约数\n");
{
int a; int b;
printf("请一次输入两个指空格隔开:");
scanf_s("%d %d", &a, &b);
a < b ? 1 : Swap(&a,&b);
int c= 0;
while (a%b != 0)
{
c = a%b;
a = b;
b = c;
}
printf("最大公约数为:%d", b);
}
"c "的引用有必要吗?我觉得有,不然a%b的结果值存在哪里,怎么给b;有人用向减的算法做,个人觉得时间复杂度比较高。
#include<stdio.h>
void Swap(int *x, int *y)
{
int a;
a = *x;
*x = *y;
*y = a;
}
int main()
{
printf("数组A,B交换:\n");
int a[5] = {0,1,2,3,4};
int b[5] = {1,2,5,4,3};
int j = 0;
for (j = 0; j < 5; j++)
printf("%d ", a[j]);
printf("\n");
for (j = 0; j < 5; j++)
printf("%d ", b[j]);
printf("\n");
int i = 0;
for (i = 0; i < 5; i++)
Swap(a + i, b + i);
for (j = 0; j < 5; j++)
printf("%d ", a[j]);
printf("\n");
for (j = 0; j < 5; j++)
printf("%d ", b[j]);
printf("\n");
printf("计算1/1-1/2+1/3、、、、-1/100的值:\n");
double sum=0.0;
double m=0.0;
for (m = 1; m<=100; m += 2)
{
sum = sum + 1 / m - 1 / (m + 1);
}
printf("%lf\n",sum);
printf("1-100中出现了多少次整数9:\n");
int count = 0;
for (i = 1; i <= 100; i++)
{
if (i % 10 == 9)
{
count++; printf("%d\t",i);
}
if ((i - i % 10) % 9 == 0 && (i > 9)) { count++; printf("%d\t", i); }
}
printf("\n%d\n", count);
}
这几个程序中,主要数组的交换,就是数组每个元素逐一交换。
计算“ / ”的时候,由于int/int的值还是int所以,为了出现浮点数,两个int至少一个改成浮点型。