欧拉计划之题目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