- 给定两个整形变量的值,将两个值的内容进行交换。
#include <stdio.h>
#include <stdlib.h>
int main(){
int x = 1;
int y = 0;
int tmp; //定义一个临时变量来进行交换
tmp = x;
x = y;
y = tmp;
printf("x=%d y=%d",x,y);
system("pause");
return 0;
}
运行结果:
- 不允许创建临时变量,交换两个数的内容。
#include <stdio.h>
#include <stdlib.h>
int main(){
int x = 1;
int y = 0;
x = x ^ y; // 进行异或运算
y = x ^ y; //将x新值与初始y值进行异或运算
x = x ^ y; //将x新值与y新值进行异或运算
printf("x=%d y=%d",x,y);
system("pause");
return 0;
}
运行结果:
异或运算(XOR)法则:两个数的二进制位相同时为0,不同时为1。即:
x 0000 0001
(^)y 0000 0000
---------------------
0000 00001
上述代码中,当两个数都不为零时,还可以利用下述方法进行内容交换:
x = x * y;
y = x / y;
x = x / y;
- 求10 个整数中最大值。
#include <stdio.h>
#include <stdlib.h>
int main(){
int a[10],i,j;
int max = a[0];
printf("请输入10个整数:“);
for(i=0;i<10;++i)
scanf("%d",&a[i]); //给数组a赋值
for(i=0;i<10;++i) //外循环数,即数组元素个数
for(j=0;j<10-i;++j) //内循环数,即数组元素个数减去当前元素下标
if(a[j]>max){ //前后两个数进行比较,将大值赋给max
max = a[j];
}
printf("max=%d",max);
system("pause");
return 0;
}
运行结果:
需要注意的是要初始化最大值,并且在内循环中if语句中的条件必须是:
a[j]>max。如果写成a[j]>a[j+1],当输入的值不是按大小顺序排列时,会运行错误,得不到想要的值,即下图所述:
- 将三个数按从大到小输出。
#include <stdio.h>
#include <stdlib.h>
int main(){
int a[3],i,j,tmp;
printf("请输入3个数:”);
for(i=0;i<3;++i)
scanf("%d",&a[i]); //给数组a赋值
for(i=0;i<3;++i)
for(j=0;j<3-i;++j)
if(a[j]<a[j+1]){ //前后两个数进行比较、交换
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
for(i=0;i<3;++i)
printf("%d\t",a[i]);//输出重新排序后的数组a
system("pause");
return 0;
}
运行结果:
在求最大值或者将数按照顺序排序时,排序方法一般可用冒泡法、比较法、选择法等。3、4中所写程序均是利用冒泡法,冒泡法较容易掌握,具体含义可看:(https://baike.baidu.com/item/冒泡排序?fromtitle=冒泡法&fromid=3424098)
- 求两个数的最大公约数。
#include <stdio.h>
#include <stdlib.h>
int main(){
int m,n,r,tmp;
printf("请输出两个数:“);
scanf("%d %d",&m,&n);
if(m<n){
tmp = m;
m = n;
n = tmp;
}
r = m % n;
while(r!=0){
m = n;
n = r;
r = m % n;
}
printf("最大公约数=%d",n);
system("pause");
return 0;
}
运行结果:
求最大公约数的方法可采用定义求法、辗转相除法,此程序采用的是辗转相除法,具体方法含义:(https://baike.baidu.com/item/辗转相除法)
在求最大公约数的程序中,需要特别注意 r=m%n 的位置,在给r初始化定义时,一定要放在当m,n按照从大到小的位置确定好的后面。