大家好,又见面了,我是你们的朋友全栈君。
方法一:辗转相除法
用 “较大数” 除以 “较小数”,再用 “较小数” 除以 “第一余数”,再用“第一余数”除以 “第二余数”,
如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a,b;
//while(scanf("%d,%d",&a,&b)!=EOF)//这样写有问题,a*b 所得值不对,好像是地址值
while((cin>>a>>b)!=NULL)
{
if(a<b)//大数放在前面
{
int temp=a;
a=b;
b=temp;
}
int gcd=0; //Greatest Common Divisor 最大公约数;
int lcm=a*b; // Lowest Common Multiple 最小公倍数;
int t=0;
while(b!=0)
{
t=a%b;
a=b;
b=t;
}
gcd=a;
lcm=lcm/gcd;
//cout<<gcd<<" "<<lcm<<endl;
printf("%d %d\n",gcd,lcm);
}
return 0;
}
方法二:更相减损法
“较大数” 减 “较小数”,循环,当两数相同时,相同的数即为“最大公约数”
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a,b;
while((cin>>a>>b)!=NULL)
{
int gcd=0; //Greatest Common Divisor 最大公约数;
int lcm=a*b; // Lowest Common Multiple 最小公倍数;
while(a!=b){
if(a>b){a-=b;}else{b-=a;}
}
gcd=a;
lcm=lcm/gcd;
printf("%d %d\n",gcd,lcm);
}
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145574.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...