【程序16】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
2.程序源代码:
main()
{
int a, b, num1, num2, temp;
printf("please input two numbers:/n");
scanf("%d, %d", &num1, &num2);
if (num1 < num2)
{
temp = num1;
num1 = num2;
num2 = temp;
}
a = num1;
b = num2;
while (b != 0) /*利用辗除法,直到b为0为止*/
{
temp = a % b;
a = b;
b = temp;
}
printf("Common divisor:%d/n",a);
printf("Common multiple:%d/n",num1*num2/a);
}
辗除法——辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至3000年前。它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。它并不需要把二数作质因子分解。
算法如下:
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:
1. 若 r 是 a ÷ b 的余数, 则
gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公因子为 a。
此题还可递归求解,程序如下:
int gcd(int a,int b)
{
if (b != 0)
return gcd(b, a%b);
else
return a;
}
main()
{
int num1, num2;
int a, b;
printf("Input two numbers:/n");
scanf("%d %d",&num1, &num2);
if (num1 < num2)
{
a = num2;
b = num1;
}
else
{
a = num1;
b = num2;
}
printf("Common divisor:%d/n",gcd(a,b));
}
要注意的是函数中的a一定要大于b