Project_Euler-05 题解
题目描述
思路
转换题意:2520是1到10这十个数的最小公倍数,求1到20这20个数的最小公倍数是多少?
我们可以先求两个数的最小公倍数,得出结果后再乘上一个新的数,依此类推,例如,先求1和2的最小公倍数为2;再求2和3的最小公倍数为6;再求6和4的最小公倍数为12…
如何求最小公倍数
我是这样去做的,先尝试将两个数乘起来,例如6和4的最小公倍数,我先将他们相乘:
6 ∗ 4 = 24 6 * 4 = 24 6∗4=24
发现24再除以2就可以得到6和4的最小公倍数。
多举几个例子寻找规律:
对于12和5,口算发现最小公倍数为60:
12
∗
5
=
60
60
/
1
=
60
12 * 5 = 60\\ 60 / 1 = 60
12∗5=6060/1=60
对于60和6,口算发现最小公倍数为60:
60
∗
6
=
360
360
/
6
=
60
60 * 6 = 360\\ 360 / 6 = 60
60∗6=360360/6=60
对于60和7,口算发现最小公倍数为420:
60
∗
7
=
420420
/
1
=
420
60*7 = 420 420/1 = 420
60∗7=420420/1=420
…
仔细观察,这些被除的数,发现他们有一个特征,那就是他们都是两个数的最大共因数。
因此得出结论:
令 a a a 和 b b b 的最小公倍数为 l c m ( a , b ) lcm(a,b) lcm(a,b),最大共因数为 g c d ( a , b ) gcd(a,b) gcd(a,b)得:
l c m ( a , b ) = a ∗ b / g c d ( a , b ) lcm(a,b)=a * b / gcd(a, b) lcm(a,b)=a∗b/gcd(a,b)
程序
由于题目中已经给出了前10个数的最大公约数,因此我们可以乘前人之凉,从11开始计算,程序代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<time.h>
int gcd (int a, int b){
return(b ? gcd (b, a % b) : a);
}
int lcm (int a, int b){
return(a * b / gcd(a, b));
}
int main() {
int ans = 2520;
for(int i = 11; i < 20; i++){
ans = lcm(ans, i);
}
printf("%d\n", ans);
return 0;
}