C#代碼分析


作為一個計算機專業的學生,代碼分析是一件很平常的,並且需要經常做的事情。

當剛接手一個程序編碼、課設或者一個項目時,常常會因找不到思路而抓狂。而網絡就是最好的工具,查看許多IT人的技術博客網站,經常采集他人代碼的長處,就會得到非同一般的效果。如下代碼是由C#編寫,對這種語言不是很熟悉,但有C語言的基礎,應該不是特別難。

using System;

using System.Collections.Generic;

using System.Text;

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);
            }
          }
        }
      }
}

 

現在把代碼進行分解:基本看來是個找數的操作,它是由兩個for循環嵌套控制,for (Int64 i = 1; i < Int64.MaxValue; i++)
首先Int64.MaxValue這個數是多大?在網上找到了答案,Int64是有符號 64 位整數數據類型,相當於C++中的long long、 C# 中的 long 和 SQL Server 中的 bigint,表示值介於 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之間的整數。存儲空間占 8 字節。用於整數值可能超過 int 數據類型支持范圍的情況。那就應該是個很大的數了,在這么大的范圍為了找幾個數,看來不是很好找。。。

再看小循環,for (int j = 0; (j < rg.Length) && (hit <=2) ; j++),rg[]是個內部含有由2~31的整數組成,共有30個數,rg.length=30。

那究竟什么樣的數才會是要找的數呢

if ((hit == 2)&& (hit1+1==hit2))
	        {
	          Console.WriteLine("found {0}", i);
	        }

 

hit==2&&hit1+1==hit2滿足這個條件才會輸出,看一看判斷條件if ((i % rg[j]) != 0),也就是說要從1~MaxLalue之內判斷不能夠整除的數,hit1為第一個不能整除數的下標,hit2為第二個不能整除數的下標。要求hit1+1==hit2,那就是說這兩個數要連續,而第二個條件就是hit==2,for (int j = 0; (j < rg.Length) && (hit <=2) ; j++),hit>2就要退出小循環hit還要等於2,也就是說只能有兩個不能被整除的數,而且要連續。

只能說這個數真心不太好找。。。

 

用vs運行了一下,等了90分鍾沒有結果。於是我改了下范圍,大循環i<Int32.MaxValue,如下圖,found1是循環結束的小標記(因為在Int64.MaxValue遲遲沒有結束,就想着用一句話來標記一下,Int32.MaxValue運行時間為99.4314475

運行時間代碼:

 

            TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
            string spanTotalSeconds = ts2.Subtract(ts1).Duration().TotalSeconds.ToString(); //計算整個程序的運行時間
            Console.WriteLine(spanTotalSeconds);
            Console.ReadKey();

 

范圍是Int16.MaxValue時,運行如下:

 然而或許我沒等到時間,90分鍾還沒有結束(感覺第一次運行這么久),我的電腦是這樣的配置,或許這樣的數真的不存在

假設這個數出現在范圍的一半位置,那么需要找2^62=4.611686018X10^18,假設計算機每秒計算一次,因為小循環內平均要執行4步,小循環會有2-30次不等,因為條件比較苛刻,所以估算大約要執行20步,那么,因為計算機位4.0GHZ,所以,計算機每秒執行2X10^8個小循環,即尋找這么多個數,那么需要,2.3X10^10秒,即為4X10^8分鍾。。。。於是放棄了計算。。。。。。。

如果想提高計算速度,在多核電腦上我們可以給每個核分配不同的找數范圍,提高計算效率,雖然覺得現在基本上多核技術都是在流水線技術上做文章,但是表示並不懂原理,只能想着在找數范圍上做文章了。。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM