給了一段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); } } } } }
講道理,我是沒有學習過C#的,僅僅學習了C和C++,稍微看了一下JAVA。
前面的那幾行using大概是類似於C裡的include,之後往下看倒是沒有什麼問題,不過看到了Int64和Int64.MaxValue,倒是沒見過,然而從使用方法來看Int64應該是屬於一種很長的整形,而Int64.MaxValue應該是屬於該整形的最大取值範圍。去網上一查倒也是猜對了,但是Int64.MaxValue這個範圍真的是大得離譜:
表示值介於 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之間的整數。儲存空間佔 8 位元組。用於整數值可能超過 int 資料型別支援範圍的情況。
(出自百度百科)
這個時候就開始疑惑了,到底是什麼數才會要從這麼大的範圍裡面找?為什麼這個程式的程式碼不使用int,而使用int64?
於是就把程式碼放進了編譯器裡面走一波,然而發現……沒動靜。這到底是編譯發生問題還是這個數特別難找?亦或是這個數根本就找不到?
從程式程式碼繼續看,第二個for迴圈
for (int j = 0; (j < rg.Length) && (hit <=2) ; j++)
迴圈條件是j小於陣列rg的長度並且還要hit小於等於2,迴圈內容就是不斷地判斷hit到底該取什麼值
回到第一個for迴圈跳過第二個for迴圈往下看,可以看到一個if語句,這個就是輸出要找的數的輸出語句
if ((hit == 2)&& (hit1+1==hit2))
看了一會,終於也是知道要幹什麼了。
回答問題:
1.要找的大概是滿足的數是“不可以同時整除2到31中連續的兩個數可以整除其他的”。
2.應該不存在,因為等了半天黑框框都沒動。(不排除硬體限制,但是沒有得到結果之前只能認定為不存在)
3.不存在的數無法計算。
4.固態硬碟加快資料傳輸速度,再改一下演算法或許會比較好。