程序参考《高质量程序设计指南——C++/C语言》 ,好书推荐
一、最大公约数(英语:Greatest Commom Divisor,gcd),指能够整除多个整数的最大正整数
而多个整数不能都为零,例如【8和12】的最大公约数为4。
辗转相除法(来自维基百科)
相比素因数分解法,辗转相除法的效率更高。计算 gcd(18,48) 时:
我们只关心每次除法的余数是否为0,为0即表示得到答案。这一算法更正式的描述是这样的:
其中
如果参数都大于0,那么该算法可以写成更简单的形式:
,
如果 a > b
如果 b > a
二、最小公倍数(Least Commom Multiple)
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
- 8=2*2*2 12 = 2*2*3
- 所以最小公倍数 = 2*2*2*3(把两者分解的都乘进去)
- 8和12的最小公倍数就是 24
注:最小公倍数 = 【8*12】除以【8和12的最大公约数】 8*12/4 = 8*3 = 24
三、递归求解
#include<stdio.h>
//求两个整数a和b的最大公约数
unsigned long gcd_2(unsigned long a,unsigned long b)
{
if(b==0){
return a;
}else{
return gcd_2(b,a%b);
}
}
int main(void){
unsigned long a,b; //两个整数
unsigned long lcm=0; //最小公倍数
unsigned long gcd=0; //最大公约数
while(1){
printf("Please input two positive integers(spacebar as separator):");
scanf("%lu %lu",&a,&b);
if(a<=0 || b<=0){
printf("Input Error!\n");
continue;
}else{
break;
}
}
gcd = gcd_2(a,b);
lcm = (a*b)/gcd;
printf("Their Greatest Commom Divisor is %lu.\n",gcd);
printf("Their Least Commom Multiple is %lu.\n",lcm);
return 0;
}
四、循环结构求解
- 求最大公约数可用辗转相除法
- 最小公倍数就是两个整数的乘积除以其最大公约数
#include<stdio.h>
int main(void){
unsigned long a,b,c=0;
unsigned long lcm=0; //最小公倍数
unsigned long gcd=0; //最大公约数
while(1){
printf("Please input two positive integers(spacebar as separator):");
scanf("%lu %lu",&a,&b);
if(a<=0 || b<=0){
printf("Input Error!\n");
continue;
}else{
break;
}
}
unsigned long ra = a, rb = b; //保存原始数据
//辗转相除法
while(a%b !=0){
c = a%b;
a = b;
b = c;
}
gcd = b;
lcm = (ra*rb)/gcd;
printf("Their Greatest Commom Divisor is %lu.\n",gcd);
printf("Their Least Commom Multiple is %lu.\n",lcm);
return 0;
}