閱讀下面程序,請回答以下問題:數組
問題1:這個程序要找的是符合什麼條件的數?post
問題2:這樣的數存在麼?符合這一條件的最小的數是什麼?spa
問題3:在電腦上運行這一程序,你估計多長時間才能輸出第一個結果?時間精確到分鐘(電腦:單核CPU 4.0G Hz,內存和硬盤等資源充足)。blog
問題4:在多核電腦上如何提升這一程序的運行效率?進程
(注:該程序、用C#語言編寫,可是隻要有C語言基礎徹底沒有閱讀壓力,若是對部分語句不懂請自行查詢)內存
要求:將上述問題結果寫到博客上。資源
using System;博客
using System.Collections.Generic;string
using System.Text;it
namespace FindTheNumber
{
class Program
{
static void Main(string[] args)
{
int [] rg =
{2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
20,21,22,23,24,25,26,27,28,29,30,31};
for (Int64 i = 1; i < Int64.MaxValue; i++)
{
int hit = 0;
int hit1 = -1;
int hit2 = -1;
for (int j = 0; (j < rg.Length) && (hit <=2) ; j++)
{
if ((i % rg[j]) != 0)
{
hit++;
if (hit == 1)
{
hit1 = j;
}
else if (hit == 2)
{
hit2 = j;
}
else
break;
}
}
if ((hit == 2)&& (hit1+1==hit2))
{
Console.WriteLine("found {0}", i);
}
}
}
}
我我的理解代碼時是當有循環時逐步記錄一下個變量的值,這樣能更方便計算結果。
可是這個代碼的循環次數有點多,這就要求咱們經過幾回的循環找到規律,而後再繼續判斷。
首先,第一次循環
i=1時,
{ j=0, rg[0]=2,hit=1,hit1=0,hit2=-1,此時還能夠再循環
so j=1, rg[1]=3,hit=2,hit1=0,hit2=1, hit<=2 知足,還能夠循環
j=2 , rg[2]=4,hit=3,hit1=0,hit2=1, 結束循環
可是在下方比較判斷條件時時,hit!=2.
}
接下來繼續外部大循環
i=2時,
{
j=0,rg[0]=2,hit=0,hit1=-1,hit2=-1
j=1,rg[1]=3,hit=1,hit1=1,hit2=-1
j=2,rg[2]=4,hit=2,hit1=1,hit2=2
j=3,rg[3]=5,hit=3,hit1=1,hit2=2 結束
能夠看出判斷條件 依然 hit!=2
}
當記錄到這裏就應該想一想從判斷條件入手想問題了,咱們根據上方for (int j = 0; (j < rg.Length) && (hit <=2) ; j++)這句能夠看出,循環結束的條件時讀完數組或hit<=2, 而這句if ((hit == 2)&& (hit1+1==hit2)) 則是說明在上方數組的全部存有的數中找到兩個連續的數,i 不能被 2~31 中相鄰的這兩個數整除,但能夠被其他28個數整除。
答
1,這個程序是要在-263到263之間的整數找到一個數,不能被 2~31 中相鄰的這兩個數整除,但能夠被其他28個數整除。
2,額 這個數我是真不知道,不過問了其餘同窗說是16,17與其它28個數的最小公倍數。是23*33*52*7*11*13*19*23*29*31=2123581660200
3,這個問題粗略的算須要計算外層的循環次數*循環一次的時間,2^63 = 9.2233720368548 * 10 18,
可是我並不知道循環一次所需的時間,百度一下說執行一億次簡單的循環對肯定機器週期爲12M晶振的計算機來講是1S,因此結果爲90億秒,9000000000/3600=2500000 days
4,我認爲應該儘量的關閉其餘進程,保證該程序的正常運行吧。