题目
求两个数的最大公约数(只有正整数才有最大公约数)。
1. 辗转相除法
详细介绍
用两个数中较大的数除以较小的数,得到余数,再用上一次运算的除数除以余数。以此类推,直到所得余数为零时,此时的除数就是两个数的最大公约数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int num = 0;
scanf("%d %d", &a, &b);
//此if语句是为了让a为两个数之间的的较大数,b中为两个数之间的较小数,其余代码中if语句作用相同。
if (b > a)
{
int i = a;
a = b;
b = i;
}
while (1)
{
num = a % b;
if (num == 0)
break;
a = b;
b = num;
}
printf("最大公约数为%d\n", b);
return 0;
}
上述代码,我输入54 63
,经过 if 语句后进入循环,63
除以54
所得的余数9
存入num,交换a和b的值,交换b和num的值,再次进行a除以b,以此类推。(当一次运算后,余数为零时,此时的除数9
,就是最大公约数。
2. 更相减损法
详细介绍
用两个数中较大的数减去较小的数,得到差,在用差和减数之间的较大的数减去较小的数。以此类推,当一次运算中减数和差相等时,此时的差就是的两个数的最大公约数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &a, &b);
while (1)
{
if (b > a)
{
int i = a;
a = b;
b = i;
}
c = a - b;
if (c == b)
break;
a = c;
}
printf("最大公约数为%d\n", b);
return 0;
}
以上述代码为例,输入54 63
,进入循环通过 if 语句使a中存放两个数的较大值,b中存较小值。63
减54
,的差为9
,54
再减9
,以此类推。当18
减9
得9
时,此时的差为两个数的最大公约数。
3. 穷举法
求两个数的最大公约数,可以知道最大公约数不会大于两个数之间较小的数,所以由较小的数开始递减,当出现第一个公约数,即为两个数的最大公约数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &a, &b);
if (b > a)
{
int i = a;
a = b;
b = i;
}
c = a - b;
while (1)
{
if (a % c == 0 && b % c == 0)
break;
c--;
}
printf("最大公约数为%d\n", c);
return 0;
}
以上述代码为例,输入54 63
,经过 if 语句,用较大数减去较小数得到的差存入c,接下进入循环来判断c是否为54
和63
的公约数,不是的话c自减,以此类推。当c为9
时,9
是54
和63
的公约数,即9
为两个数的最大公约数。