最大公约数和最小公倍数
小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。
辗转相除法
#include int main(){ //辗转相除法 //大小%小数 余数给小数 小数给大数 余数为0结束 大数是最大公倍数 long num1,num2; long max,min; long maxgy,mingb; long temp; long result; scanf("%d%d",&num1,&num2); max = num1; min = num2; if(num1<num2){ max = num2; min = num1; } while(temp){ temp=max%min; max= min; min= temp; } maxgy = max; mingb = (num1*num2)/max; result = maxgy+mingb; printf("%ld",result); return 0; }
更相减损术
int main(){ //更相减损术 //大数-小数 差给小数 小数给大数 小数与差相等结束 小数是最大公约数 long num1,num2; long max,min; long maxgy,mingb; long temp; long result; scanf("%d%d",&num1,&num2); max = num1; min = num2; if(num1 < num2){ max = num2; min = num1; } if(max%min==0){ maxgy = min; }else{ while(1){ temp = max-min; max = min>temp?min:temp; min = min>temp?temp:min; if(min == max-min) break; } maxgy = min; } mingb = (num1*num2)/maxgy; result = maxgy+mingb; printf("%ld",result); }
穷举法
#include int main(){ //采用穷举法求最大公约数 //从最小数开始找,依次递减找出 大数%t==0 && 小数%t==0 long num1,num2; long max,min; long maxgy,mingb; long result; long temp; scanf("%d%d",&num1,&num2); max = num1; min = num2; if(num1<num2){ max = num2; min = num1; } temp = min; for(;temp>0;temp--){ if(max%temp==0 && min%temp==0){ break; } } maxgy = temp; mingb = (num1*num2)/maxgy; result = maxgy+mingb; printf("%ld",result); }
最小公倍数
- 两数相乘/最大公约数
- 小数的n倍%大数==0
#include int main(){ long num1,num2; long max,min; long mingb; long temp; scanf("%d%d",&num1,&num2); max = num1; min = num2; if(num1<num2){ max = num2; min = num1; } temp = min; while(temp%max!=0){ temp+=min; } mingb = temp; printf("%d",mingb); }