Project Euler——Problem 5 - Daybreakcx's Blog - Keep Programming! With Algorithm! With Fun!
Project Euler——Problem 5
daybreakcx
posted @ 2009年7月14日 01:43
in Prject Euler
, 1734 阅读
原题与答案:
Problem 5
30 November 2001
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest number that is evenly divisible by all of the numbers from 1 to 20?
Answer:232792560
分析与解答:
本题求可以被1到20整除的最小的数是多少,这个根据数论性质可以很容易得出,我是笔算得到的结果,题目可以转化为求1到20的最小公倍数,这个问题有一种求法是利用求最大公约数得到:两个数的最小公倍数等于他们的乘积除以他们的最大公约数,而最大公约数可以利用辗转相除法轻松得到,但是这样对于像20这样的小数值未免有点浪费,于是可以用另一个知识:假设a质因数分解是,b的质因数分解是,实际中两个数的质因数集合不一定相同,我们对于a有而b没有的质因数设置,对于b有而a没有的质因数设置,那么我们可以得到a和b的最小公倍数,利用这条性质我们只要求出每个小等于20的质数的可能得到的最大次数即可,具体实现见源代码:
-
#include<stdio.h>
-
int plist[8]={2,3,5,7,11,13,17,19},s=20,ans=1,i,t;
-
int main()
-
{
-
for (i=0;i<8;i++)
-
{
-
t=1;
-
while (t<=s) t*=plist[i];
-
ans*=t/plist[i];
-
}
-
return 0;
-
}
2010年7月27日 04:28
呃,在http://whitedeath.is-programmer.com/posts/18075.html看到另一种解法。。。
ans = 1 * 16 * 9 * 5 * 7 * 11 * 13 * 17 * 19;
2011年1月27日 03:36
其实你有没有考虑过那些数怎么得来的呢
16=2^3
9=3^2
实际上还是20以内的素数而已,那文章我看过了,它将某些部分直接给了结果,实际上方法用的是一样的,都要保证各个素数的次数是1到20中的最大值,呵呵:)