小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。
小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。
每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)
对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。
10 20
30
15 20
65
#include <stdio.h> //辗转相除法 long gcd(long a, long b) { while (a % b) { long c = a % b; a = b; b = c; } return b; } //两数的乘积再除以两数的最大公约数法 long lcm(long a, long b, long c) { return a * b / c; } int main() { long a, b; while (scanf("%ld %ld", &a, &b) != EOF) { long max = gcd(a, b); long min = lcm(a, b, max); printf("%ld\n", max + min); } return 0; }
#include <stdio.h> int main() { // 定义变量 long long int a = 0; long long int b = 0; // 输入 scanf("%lld %lld",&a, &b); // 先保存a*b,因为我们找到a*b就是他们两个最大公约数和最小公倍数之和 long long int l = a*b; // 辗转相除法算出最大公约数 long long int c = 0; while(a%b!=0) { c=a%b; a=b; b=c; } // 判断c是否为0,可能会出现求10和10这种情况,c为0,我们不可以出现除以0的情况 if(c) { long long int w = (l)/c; printf("%lld",w+c); } else { long long int w = l/a; printf("%lld",w+a); } return 0; }
#include <stdio.h> long long Max_divisor(int a, int b) { int c = 0; //辗转相除法 // (a、b)的最大公约数 == (b、r)的最大公约数 注:r 为 a / b 的余数 // 所以不断除下去,直到余数为0,此时的被除数就是原(a、b)的最大公约数 // while (c = a % b) { a = b; b = c; } return b; } long long Min_multiple(int n, int m) { return (long long )n*m/Max_divisor(n, m); } int main() { int n = 0; int m = 0; long long sum = 0; scanf("%d %d", &n, &m); //最大公约数 sum += Max_divisor(n, m); //最小公倍数 sum += Min_multiple(n, m); printf("%lld\n", sum); return 0; }
int main() { long x, y; long r = 0; scanf("%ld %ld", &x, &y); int max = x > y ? x : y; int min = x < y ? x : y; while (r = max % min) { max = min; min = r; } printf("%ld", x * y / min + min); return 0; }
#include <stdio.h> //调试中数值过大 所以整型为long long long long funny(long long a,long long b){ long long i; while((i=a%b)!=0){ a=b; b=i; } return b; } //辗转相除求最大公约数 b long long fummin(long long a,long long b){ long long min; min=(a*b)/funny(a,b);//最小公倍数=两数之积除以最大公约数 return min; } //最小公倍数 int main() { long long i,j,n,k,m; scanf("%lld %lld",&m,&n); i=funny(m,n); j=fummin(m,n); k=i+j; printf("%lld\n",k); return 0; }
#include <stdio.h> int main() { long long n = 0, m = 0; //给两个整数 long long ret = 1; //辗转相除发求最大公约数 long long num = 0; //存放两个整数相乘的值 long long g = 0; //存放最小公倍数 scanf("%lld %lld", &n, &m); num = n * m; while ((ret = n % m) != 0) //当ret=0时跳出循环 { //辗转相除法求最大公约数,当ret=0时m就是最大公约数 n = m; m = ret; //m就是最大公约数 } g = num / m; //两整数的乘积=两个整数的 最大公因数×最小公倍数 printf("%lld", g + m); return 0; }
int main() { long long a = 0; long long b = 0; long long max = 0; long long zuixiaogongbeishu = 0; scanf("%lld %lld", &a, &b); max = a * b; while (a != b) { if (a > b) { a = a - b; } else { b = b - a; } } zuixiaogongbeishu = max / a; printf("%lld", a + zuixiaogongbeishu); return 0; }
// 短除法 #include <stdio.h> typedef long long int_64; int_64 getGreatestComDiv(int_64 x, int_64 y); int_64 getLeastComMul(int_64 x, int_64 y, int_64 (*pf)(int_64, int_64)); int main() { // enter two numbers int_64 a, b; scanf("%lld %lld", &a, &b); printf("%lld\n", getGreatestComDiv(a, b) + getLeastComMul(a, b, &getGreatestComDiv)); return 0; } int_64 getGreatestComDiv(int_64 x, int_64 y) { int_64 result = 1, i = 2, temp; // To confirm the larger number, select y to be the larger one. if (x > y) { temp = x; x = y; y = temp; } // Check for the greatest common divisor by while-loop while (i <= x) { // To make sure i is a common divisor of both two numbers if ((x % i == 0) && (y % i == 0)) { x /= i; // Keep the value of x to next loop y /= i; // Keep the value of y to next loop result *= i; i = 2; } else { i++; } } return result; } int_64 getLeastComMul(int_64 x, int_64 y, int_64 (*pf)(int_64, int_64)) { int_64 result; result = (x * y) / pf(x, y); return result; }
#include <stdio.h> int main() { long long n = 0, m = 0; scanf("%lld %lld", &n, &m); long long oldn = n, oldm = m;; long long sum = 1; while (sum = (n % m)) { n = m; m = sum; } // int i = 1; // for (i = 1;; i++) { // if (i * oldn % oldm == 0) { // break; // } // } printf("%lld", m +(oldn*oldm)/m); }