第三週續(讀代碼)

閱讀下面程序,請回答以下問題:數組

問題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,我認爲應該儘量的關閉其餘進程,保證該程序的正常運行吧。

相關文章
相關標籤/搜索