欧拉计划之题目5:找出最小的能被1-20中每个数整除的数。

本题来自:http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/6-51-20

 

 1 #include <stdio.h>
 2 
 3 void zhengshu(int n)
 4 {
 5     int i,j,flag=1;
 6     for(i=n*(n-1);;i+=n)
 7     {
 8         for(j=(n/2)+1;j<=n;j++)
 9             if(i%j!=0)
10             {
11                 flag=0;
12                 break;
13             }
14             else
15                     flag=1;
16         if(flag==1)
17             break;
18     }
19     printf("%d\n",i);
20 }
21 
22 void main()
23 {
24     zhengshu(10);       //找出1-10整除的数
25     zhengshu(20);       //找出1-20整除的数
26 }

解析:
分析1-10整除:能被10整除的,肯定同时能被1、2、5整除;能被9整除的,肯定能被1、3整除;能被8整除的,肯定被2、4;能被6整除,肯定被2、3整除······

能同时被6、7、8、9、10整除的,肯定能被1、2、3、4、5整除。

分析1-20整除:同上的方法,能同时被11、12、···、19、20整除的,肯定能被1至10整除。

所以是(n/2)+1开始查找整除的。

for(i=n*(n-1);;i+=n),同时能被整除,最大的数也能整除,这里减少循环次数。只是满足了最大的两个数能被最小的一个数整除,那最小的这个。

 

感悟:

原本是写的i++来循环递增的,但是发现1-20整除,电脑反应不过来,计算速度慢。所以才用的这个算法。如果你们有更好的算法,希望能说下,谢谢。

 

更好的方法:

1-20的素数表:2,3,5,7,11,13,17,19
叠乘:2*2*2*2=16,剔除2取得8
3*3=9,到达临街条件,取得3
最终叠乘:2*3*5*7*11*13*17*19*3*8=232792560

posted @ 2013-02-17 00:48  橙&子  阅读(765)  评论(8编辑  收藏  举报