标签:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace FindTheNumber 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 int [] rg = 12 {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, 13 18,19,20,21,22,23,24,25,26,27,28,29,30,31}; 14 15 for(Int64 i = 1; i < Int64.MaxValue; i++) 16 { 17 int hit = 0; 18 int hit1 = -1; 19 int hit2 = -1; 20 for (int j = 0; (j < rg.Length) && (hit <= 2); j++) 21 { 22 if((i % rg[j]) != 0) 23 { 24 hit++; 25 if(hit == 1) 26 { 27 hit1 = j; 28 } 29 else if (hit == 2) 30 { 31 hit2 = j; 32 } 33 else 34 break; 35 36 } 37 } 38 39 if((hit == 2) && (hit1 + 1 == hit2)) 40 { 41 Console.WriteLine("found {0}", i); 42 } 43 44 } 45 } 46 } 47 }
以上是所给的源代码
该题目所要找的是不能整除2至31的相邻两个数却能整除其他所有数的数。注:由其中的for循环不难看出这段程序的真正目的。
这样的数存在。
First,对于2至31这30个数,我们可以先将其分为两组。第一组,2至15,因为2至15的2倍均在16至30中,能整除大的数据一定可以整除她的因子,故,我们找最小的符合条件的数据,就应在15至31中去除最小的两个相邻的数,即16和17.
Second,我们将每一个数都拆分成最小的因子相乘,例,8=2*2*2,9=3*3等等,要得到最小的满足条件的数据,则应使用最少的因子,将所有的数据组合起来。如,8=2*4,2和4就不需要了。在上面的程序中,只要i能整除8,就能整除2和4.
Last,最后就是要讨论不能被16,17整除的问题了,第二部将所有的因子都列出来,要得到8,至少要3个2,要得到27至少要3个3,要得到25,至少要2个5,其余的素因子都只需一个就够了。
所以,我们得到的最少的因子的组合就是 :2*2*2,3*3*3,5*5,7,11,13,17,19,23,29,31。将他们相乘就得到了最小的符合数据的数:2123581660200
标签:
原文地址:http://www.cnblogs.com/PerseusQ/p/5298964.html