算例一
-
题目描述
-
解题思路
①欧几里得算法:若a、b 全为零则它们的最大公约数不存在;若a、b 其中之一为零,则它们的最大公约数为a、b 中非零的那个;若a、b 都不为零,则使新a = b;新b = a %b 然后重复该过程
-
解题代码
#include <stdio.h>
int gcd(int a, int b) {
if (b == 0) return a; //若b为零则最大公约数为a
else return gcd(b, a % b); //否则,则改为求b与a%b 的最大公约数
}
int main() {
int a, b;
while (scanf("%d%d", &a, &b) != EOF) { //输入两个正整数
printf("%d\n", gcd(a, b)); //输出所求的最大公约数
}
return 0;
}
//该代码把求最大公约数的欧几里得算法写成了递归的形式,若读者对理解递归有困难,
//这里我们也给出其非递归形式,供读者参考。
//代码3.6
#include <stdio.h>
int gcd(int a, int b) {
while (b != 0) { //只要b不为0则一直持续该过程
int t = a % b;
a = b; //使a变成b
b = t; //使b变成a % b
}
return a; //当b为0时,a即是所求
}
int main() {
int a, b;
while (scanf("%d%d", &a, &b) != EOF) {
printf("%d\n", gcd(a, b));
}
return 0;
}
-
注意点
①无
算例二
-
题目描述
-
解题思路
①思路规则:a、b 两数的最小公倍数为两数的乘积除以它们的最大公约数
-
解题代码
#include <stdio.h>
int gcd( int a,int b) { //求最大公约数
return b != 0 ? gcd(b,a % b) : a;
}
int main () {
int a , b;
while (scanf ("%d%d" ,& a,& b) != EOF ) {
printf ("%d\n" ,a * b / gcd(a,b)); //输出两数乘积与最大公约数的商
}
return 0;
}
-
注意点
①无