求最小公倍数算法:
最小公倍数=两整数的乘积÷最大公约数
求最大公约数算法:
(1)辗转相除法
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
/* 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b=c,再回去执行① */ #include <stdio.h> int common_divisor_func(int num1, int num2); int main() { int n; int num1, num2; int common_divisor, common_multiple; scanf("%d", &n); while(n--) { scanf("%d%d", &num1, &num2); common_divisor = common_divisor_func(num1, num2); common_multiple = num1 * num2 / common_divisor; printf("%d %d ", common_divisor, common_multiple); } getchar(); return 0; } int common_divisor_func(int num1, int num2) { int c; int tmp; c = num1 % num2; while(num2 != 0) { c = num1 % num2; num1 = num2; num2 = c; } return num1; }
//比较递归计算最小公倍数 //注意必须a > b int gcd(int a, int b) { if(b == 0) { return a; } else { return gcd(b, a % b); } }
这个算法看起来其实并不是很难,但是到了实际应用的时候可能要考虑很多的东西,比如两个很大的数的最小公倍数有可能已经超出了int的范围了,这个时候就要使用long long或者__int了
还有那个
common_multiple = num1 * num2 / common_divisor;
有的时候可以先除后乘。
计算一个数的所有的约数
int arr[100]; int i; for(i = 0;i * i < sqrt(num);i++) { if(num % i == 0) { arr[top++] = i; srr[top++] = num / i; } }