#include <stdio.h> #include <math.h> #if 0 //1.暴力试除法 int the_max(int a, int b){ //获取两数中的较大数 return a > b ? a : b; } int the_min(int a, int b) { //获取两数中的较小数 return a < b ? a : b; } int main() { int a,b; printf("请输入两个数字:>"); scanf("%d %d", &a, &b); if((a<0 && a>100000)&&(b<0 && b>100000)){ printf("a或b超出范围\n"); return -1; } //最小公倍数:大于等于两个数中最大的数,小于两个数的乘积 //先求最小公倍数 int min = the_max(a,b);//定义变量存储 for (; min <= a * b; min++){ if (min % a == 0 && min % b == 0) break; } printf("%d %d两数的最小公倍数为%d\n", a, b, min); //最小公倍数:小于等于两个数中最小的数 //最大公约数,原理基本相同 int max = the_min(a, b);//定义变量存储 for (; max > 0; max--){ if (a % max == 0 && b % max == 0) break; } printf("%d %d两数的最大公约数为%d\n", a, b, max); return 0; } #endif #if 1 //2.优雅试除法_效率更高 //经过测试,这种方法虽然优雅 //但在求最大公约数时可能会出错 //比如 2048与408,其他方法是8,而这是16! //没有最优的方法,只有最灵活的方法!!! //优雅试除法求最小公倍数完全没有问题!但求最大公约数要慎重,有用的方法才是好方法 int main() { int a,b; printf("请输入两个数字:>"); scanf("%d %d", &a, &b); int ret = 1;//效率提高的关键变量 while ((a * ret) % b)//将一个数逐次提高倍数,然后对另一个数求余,特定情况下并不见得比暴力试除法好 ret++; printf("%d %d两数的最小公倍数为%d\n", a, b, a*ret); /* ret = 1;//关键变量 //测试发现,当先输入奇数,再输入偶数时会出错 //以及都是偶数时,前数字较大会出错 //原因:两个整数相除时会自动忽略小数部分 int min = a < b ? a : b;//找出较小值 int max = a > b ? a : b;//找出较大值 while (max%(min/ret)) //error:行不通,如果用float强转会导致%右边不是整数 ret++; printf("%d %d两数的最大公约数为%d\n", a, b, min / ret); */ printf("%d %d两数的最大公约数为%d\n", a, b,(a*b)/(a*ret)); return 0; } #endif #if 0 //3.辗转相除法(欧几里得算法) #include<stdio.h> int main() { int a,b; printf("请输入两个数字:>"); scanf("%d %d", &a, &b); int a1 = a;//辗转相除会改变值 int b1 = b;//因此需要替身 int tmp = 0; while (b1){ //辗转相处求出最大公约数 tmp = a1 % b1; a1 = b1; b1 = tmp; //此时a1就是最大公约数 } // a * b / a1 = 最小公倍数 //a * b = 最大公约数 * 最大公倍数 printf("%d %d两数的最小公倍数为%d\n", a,b,a*b/a1); printf("%d %d两数的最大公约数为%d\n", a, b, a1); return 0; } #endif
最小公倍数的三种求法(含最大公约数)[转载于某位很用心的博主]
于 2022-09-14 23:13:12 首次发布