最小公倍数=输入的两个数之积除于它们的最大公约数(a*b/最大公约数),关键是求出最大公约数;
定义:先用较大的数除以较小的数,算出余数。然后用除数继续除以余数,求出新的余数。接着再用除数除以余数…不停循环…直至余数为0,最终b就是最大公约数。示例(a=1997,b=615):
a | b | a mod b | |
---|---|---|---|
1997 | 615 | 152 | 1997/615=3…152 |
615 | 152 | 7 | 615/152=4…7 |
152 | 7 | 5 | 152/7=21…5 |
7 | 5 | 2 | 7/5=1…2 |
5 | 2 | 1 | 5/2=2…1 |
2 | 1 | 0 | 2/1=2…0 |
#include
int main(){
int a,b;
printf("请输入a,b的值:");
scanf("%d %d",&a,&b);
if(a<b){ //交换a,b 的大小
int temp = b;
b = a;
a = temp;
}
int r; //r代表余数
r = a%b;
int n;
n = a*b; //最小公倍数为a*b/GCD
while(r!=0){
a = b;
b = r;
r = a%b;
}
printf("最大公约数是%d,最小公倍数为%d",b,n/b);
return 0;
}
#include
//递归实现最大公约数
int gcd(int a,int b){
if(a%b == 0)
return b;
else
return gcd(b,a%b);
}
int main(){
int a,b;
printf("请输入a,b的值:");
scanf("%d %d",&a,&b);
if(a<b){ //交换a,b 的大小
int temp = b;
b = a;
a = temp;
}
int n;
n = a*b; //最小公倍数为a*b/GCD
printf("最大公约数是%d,最小公倍数为%d",gcd(a,b),n/gcd(a,b));
return 0;
}
更相减损法出自《九章算术》:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
具体方法:
第一步:任意给定两个正整数;若都是2偶数,则用2约简;否则,执行第二步。
第二步:两个数之间大的数字减小的数字,之后将得到的差与较小的数比较,并以大数减小数,一直循环,直到减数与所得的差相同,此时的差即为两个数之间的最大公约数。
第三步:得出来的差和约去的2的乘机就是最大公约数
示例(a=12,b=6)
第一步:约简为6,3(约减1次);
第二步:
a | b | a-b |
---|---|---|
6 | 3 | 6-3=3 |
第三步:3*2=6(gcd);
#include
int main(){
int a,b;
int x; //两数之差
printf("请输入a,b的值:");
scanf("%d %d",&a,&b);
int n = a*b; //两数之积
int i=0; //记录约去2的个数
while(a%2==0 && b%2==0){
a/=2;
b/=2;
i++;
}
if(a<b){
int temp=b;
b = a;
a = temp;
}
x = a-b;
while(x!=b){
a = x>b?x:b;
b = x<b?x:b;
x = a-b;
}
if(i==0)
printf("最大公约数为%d,最小公倍数为%d",x,n/x);
else{
for(int j=0; j<i; j++){
x = x*2;
}
printf("最大公约数为%d,最小公倍数为%d",x,n/x);
}
return 0;
}
#include
//递归
int gcd(int a,int b){
if(b == a-b)
return b;
else
return gcd(a-b>b?a-b:b,a-b<b?a-b:b);
}
int main(){
int a,b;
printf("请输入a,b的值:");
scanf("%d %d",&a,&b);
int n = a*b; //两数之积
int i=0; //记录约去2的个数
while(a%2==0 && b%2==0){
a/=2;
b/=2;
i++;
}
if(a<b){
int temp=b;
b = a;
a = temp;
}
if(i==0)
printf("最大公约数为%d,最小公倍数为%d",gcd(a,b),n/gcd(a,b));
else{
int x = gcd(a,b);
for(int j=0; j<i; j++){
x = x*2;
}
printf("最大公约数为%d,最小公倍数为%d",x,n/x);
}
return 0;
}
【最大公约数】:对于两个不同的正整数a,b,在[1,min{a,b}]中存在能同时被a和b所整除的数字,其中最大的数字就是最大公约数。
【最小公倍数】:对于两个不同的正整数a,b,从max{a,b}开始,找到的第一个能够整除a和b的数字,即为最小公倍数。
#include
//穷举实现最大公因数
int gcd(int a,int b){
int temp;
int max=1; //公因数中最大的
if(a<b){
temp = a;
a = b;
b = temp;
}
for(int i=1; i<=b; i++){
if(a%i==0 && b%i==0)
max = i;
}
return max;
}
//穷尽实现最小公倍数
int lcm(int a,int b){
int max; //a和b之中较大的数
max = a>b?a:b;
int i;
for(i=max; ; i++){
if(i%a==0 && i%b==0)
break;
}
return i;
}
int main(){
int a,b;
printf("请输入a,b的值:");
scanf("%d %d",&a,&b);
printf("最大公约数为%d,最小公倍数为%d",gcd(a,b),lcm(a,b));
}