1、给定两个整型变量的值,将两个值的内容进行交换
#include <stdio.h>
#include <stdlib.h>
int main() {
int a = 0;
int b = 0;
int tmp = 0; // C中规定:定义变量必须放到代码最前端
scanf_s("%d%d",&a,&b);
// 注意在scanf语句中%d之间不需要换行或空格,因为换行键对它来说就是一次读入
tmp = a;
a = b;
b = tmp;
printf("a = %d b=%d\n", a, b);
}
2、不允许创建临时变量,交换两个数的内容
#include <stdio.h>
#include <stdlib.h>
int main() {
int a = 0;
int b = 0;
scanf("%d%d",&a,&b);
// 方法1:利用本身数学算术特性
a = a + b;
b = a - b;
a = a - b;
// 方法2:按位异或操作:
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b=%d\n", a, b);
}
扩展:
① 找出整型数组里只出现一次的数字,其他数字出现两次;
(思路:运用异或运算,任何一个数字异或它自己都等于0)
② 找出整型数组里只出现了一次的两个数字,其他的数字都出现了两次;(思路:所有数字依次异或的结果就是这两个只出现一次的数字的异或结果)
③ 要求时间复杂度是O(n),空间复杂度是O(1)。
(辅助空间被限制,Hash表思路不可用)
3、求10个整数中的最大值
#include <"stdio.h">
#include <"stdlib.h">
int main() {
int arr[10] = { -1, 2, -3, 4, -5, 6, -7, 8, -9, 0 };
int max = arr[0];
for (int i = 1; i < 10; i++){
if (arr[i]>max){
max = arr[i];
}
}
printf("%d\n", max);
system("pause");
return 0;
}
4、将三个数按从大到小顺序输出
void Swap(int *pa, int *pb) {
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main(){
int a = 0;
int b = 0;
int c = 0;
scanf_s("%d%d%d", &a, &b, &c);
if (a < b){
Swap(&a, &b);
}
if (a < c){
Swap(&a, &c);
}
if (b < c){
Swap(&b, &c);
}
printf("%d %d %d\n", a, b, c);
system("pause");
return 0;
}
4、求两个数的最大公约数
// “辗转相除法”
int main(){
int a = 24;
int b = 18;
// 此处若a小b大也可以算,经过一次循环会交换过来
// 可加入b不能为0 的判断条件
while (a%b != 0)
{
int tmp = a%b;
a = b;
b = tmp;
}
printf("%d\n", b);
system("pause");
}