求最小公倍数
方法一:暴力穷举
思路:通过暴力穷举i来分别对a和b相除,直到发现第一个可以同时除尽的数,就是它们的最小公倍数。
缺点:慢
//最小公倍数 // 方法一(穷举法) #include<stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int i = (a > b ? a : b); while (1) { if ((i % a == 0) && (i % b == 0)) { break; } else { i++; } } printf("%d", i); return 0; }
求最小公倍数
方法二:倍数递增法求最小公倍数
思路:首先明确一点,最小公倍数一定是a和b的倍数,那么我们锁定a或b中的一个,这边以a举例,a的n倍如果能够整除b,那么这个数一定是a和b的公倍数,我们从1倍开始乘起,找到最先可以整除b的数,(a*最先可以整除的数)就是a和b的最小公倍数。
优点:较第一种更快速。
#include<stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int i = 1; while (1) { if ((a * i) % b == 0) { break; } else { i++; } } printf("%d", i*a); return 0; }
求最大公约数和最小公倍数
方法:辗转相除法
思路:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是 0 为止。
此时的被除数就是最大公约数。
两原来的数相乘再除以最大公约数就是他们的最小公倍数。
#include<stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int tmp1 = a; int tmp2 = b; int c = 0; while (a % b) { c = a % b; a = b; b = c; } printf("最大公约数:%d", a); printf("\n最小公倍数:%d", tmp1 * tmp2 / a); return 0; }
其实a或者b谁大谁小都无所谓,因为经过第一轮循环,大的就会跑到前面,小的就会跑到后面。
举例:a=3;b=5
--------------------
c=3%5=3
a=5
b=3(大的跑到了前面,小的跑到了后面)
---------------------
c=5%3=2 (若a=5,b=3举例,则直接执行这个过程)
a=3
b=2
----------------------
c=3%2=1
a=2
b=1
----------------------
c=2%1=0
a=2
b=0(最终都是这个结果)
--------------------
结束循环
此时原来的被除数a就是最大公约数
tmp1*tmp2/a就是最小公倍数。
总结:如果说刚开始。a 小于 b,那么经过第一轮之后,它们两个就会交换位置,然后 a 就会变成了一个大的数,b 就会变成了一个小的数。然后再进行循环。这样的话,无论怎么样,被取余的那个数(a)一定都是最后的最大公约数。取余的那个数最(b)后都会变为0。然后a*b/最大公约数就是我们要求的最小公倍数。
希望通过这篇博客,能让大家对穷举法、倍数递增法以及辗转相除法求最大公约数和最小公倍数有更清晰、深入的理解。编程的世界丰富多彩,每一种算法都像是一把独特的钥匙,能开启解决不同问题的大门。愿我们都能在这片知识的海洋里,不断探索,收获更多宝贵的知识财富。
如果大家在学习过程中有任何疑问,或者有更好的思路和方法,欢迎在评论区留言交流,让我们一起在编程的道路上携手前行,共同进步~