交换两个数及不创建临时变量交换两个数
(1)一般两个数的交换
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int c;
c = a;
a = b;
b = c;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
(2)不创建临时变量交换两个数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a=1, b=0;
a = a^b;
b = a^b;
a = a^b;
printf("%d %d\n", a, b);
return 0;
}
其中的 ^ 符号表示按位异或(相同为0,不同为1),相关的还有按位与(都为1才为1),按位或|(有一个1则结果为1)。
值得注意的是,虽然这种不创建临时变量的方法显得高大上,但是一般程序都用第一种方法,毕竟程序要给人看的,最好甚至能让不懂c的人看懂。
求两个数的最大公约数
数学思想就是,两个数都能同时除尽的最大的那个数,这两个数中若较大数可以被较小数除尽,则较小数为他们的最大公约数。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
int k, m, n, a, b;
printf("输入两个数");
scanf("%d%d", &m, &n);
if (m > n){
a = n;
}
else{
a = m;
}
for (k = 1; k <= a; k++){
if (m%k == 0 && n%k == 0){
b = k;
}
}printf("%d", b);
return 0;
}
再来个装逼的,百度一下求两个数的最大公约数的方法——辗转相除法,把他写成代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
int c;
while (c = a % b)
{
a = b;
b = c;
}
printf("%d", b);
return 0;
}
那如何跳出循环呢? 其实他自己可以跳出循环,因为在c语言中,0为假,非0为真,所以只要当while()中的值为0,则自动跳出。在这没有按辗转相除法的定义比较出两个数的大小是因为不需要,就算是小数除以大数,其余数也是那个大数,也就是多除一步的事。那最不济的情况就是两个数互质,那就是用循环到某一次的数除以 1,其余数依然为0,也可以跳出循环。
求十个数中最大的数
思想就是创建一个变量并赋值,然后用这个变量与那十个数依次比较,将较大值放入这个变量中,最后输出即可。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
int arr[10] = {0,3,2,4,1,9,5,6,7,8,};
int max = 0;
int i = 0;
for (i = 0; i < 10; i++){
if (max < arr[i]){
max = arr[i];
}
}
printf("%d\n", max);
return 0;
}
来个小升级:找出最大值和次大值。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a[9] = { 0x80000000, 7, -5, 5, 56, -1, 0, 6, 3 };
int max = a[0];
int sec = 0x80000000;
for (int i = 0; i < 9; i++){
if (max < a[i]){ //表示max与a中元素比较,当max小于a【i】时,此时a【i】为最大值,而max为次大值
sec = max;
max = a[i];
}
else if(sec<a[i+1]){//表示此数组中的第一个元素已经是该数组最大值,则其值不变,只需找出该数组中从第二个元素到最后一个中的最大值,即找出了所有元素中的次大值
sec = a[i+1];
}
}
printf("%d\n", max);
printf("%d\n", sec);
return 0;
}
但是这种将max初始化为数组第一个元素会有弊端,当需要将这个数组的最大值,次大值,次次大值等都要打印出来时,则每个嵌套的else if 中的a【i】需要依次+1,+2,+3等 ,十分不方便,显得复杂,此时应该将max初始化为有符号的最小值,即0x80000000。代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[10] = { 9, 8, 7, 0, -1, 4, 2, -3, 3, 1 };
int max = 0x80000000;
int sec = 0x80000000;
int i;
for (i = 0; i < 10; i++)
{
if (max < arr[i])
{
sec = max;
max = arr[i];
}
else if (sec < arr[i])
{
sec = arr[i];
}
}
printf("%d\n", max);
printf("%d\n", sec);
return 0;
}
此时,若需要输出最大值,次大值或次次大值等,只需嵌套即可。