方法一:辗转相除法
用 "较大数" 除以 "较小数",再用 "较小数" 除以 "第一余数",再用“第一余数”除以 “第二余数",
如此反复,直到最后余数是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;}