思路:两个数的最大公约数一定小于或等于较小数的二分之一。
#include <stdio.h>
int main()
{
int cancel;
int MIN = 0;
int a = 0;
int b = 0;
printf("请输入两个数(每个数之间用逗号间隔):");
scanf("%d,%d", &a,&b);
MIN = (a > b) ? b : a; //三目运算符
for (int i = 1; i <= (MIN / 2); i++)//i必须从1开始,因为0不能做除数
{
if (a % i == 0 && b % i == 0)
{
cancel = i;
}
}
printf("最大公约数是:%d\n", cancel);
return 0;
}
该方法易想,但不好。当数太大是时候要经过的循环太多了;这个时候我们就要换思路。
辗转相除法
-
辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
-
用较大数除以较小数,再用出现的余数去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后为0,则除数为最大公约数。
int main() { int a = 0; int b = 0; int MAX = 0; int MIN = 0; int i; printf("请输入两个数(数之间请用英文逗号隔开):"); scanf("%d,%d", &a, &b); if (a > b) { MAX = a; MIN = b; } else { MAX = b; MIN = a; } i = MAX % MIN; while (i!=0) { i = MAX % MIN; MAX = MIN; if (i == 0) break; else MIN = i; } printf("这两个数的最大公约数是:%d",MIN); return 0; }