2012-08-15 63 views
2

我已經解決了項目歐拉問題16,但發現這個相當新穎的方法,但我不能讓我的周圍使用(從http://www.mathblog.dk/project-euler-16/)技術頭:這個C#代碼如何解決答案?

int result = 0; 

BigInteger number = BigInteger.Pow(2, 1000); 

while (number > 0) { 
    result += (int) (number % 10); 
    number /= 10; 
} 

我的版本似乎更傳統的,但我覺得上面的方法是冷卻器。

var result = BigInteger 
    .Pow(2, 1000) 
    .ToString() 
    .Aggregate(0, (total, next) => total + (int) Char.GetNumericValue(next)); 

如何進行數學上的第一種方式工作,這是很酷,但我需要一些解釋,以幫助我瞭解,所以如果有人會這麼好心給我解釋,我真的很感激。

注意:如果我在錯誤的部分張貼,請讓我知道更好的地方問。

+3

我花了更長的時間來了解你的技術比我花了理解另一個代碼。看起來很明顯或傳統的東西很大程度上取決於你習慣的東西。 – CodesInChaos 2012-08-15 15:14:11

+0

哈哈對不起 – 2012-08-15 15:15:01

+1

爲什麼'.ToString()。Select(char.GetNumericValue).Aggregate()'?擺脫凌亂的拉姆達。 – 2015-01-22 18:00:40

回答

6

value % 10將返回最後一位數字(除以10後的餘數)。將整數除以10將刪除此數字。

將該數字看作一個列表,並且您只是將列表出來並對這些值進行求和。

+2

我認爲這裏要提到的關鍵是_integer division_ technique截斷而不是產生小數值。 – 2012-08-15 15:13:03

+0

不得不閱讀你所說的幾句話才能得到它,當你以「正確」的方式思考它時,它很簡單,謝謝。 – 2012-08-15 15:20:22

+2

授予您作爲答案,由於票數最高和作爲第一個人回答。 – 2012-08-15 15:21:50

1
  1. 他們找到了數字2^1000。

  2. 模10獲得最低有效位。 E.G. 12034%10 = 4

  3. 將10位分爲最低有效位。 E.G. 12034/10 = 1203

  4. 他們總結了這些最不重要的數字。

2

number % 10提取最不重要的十進制數字。例如12345 =>5

number/10刪除最不重要的十進制數字。這是有效的,因爲C#中的整數除法將其餘部分拋棄。例如12345 =>1234

因此,上面的代碼提取每個數字,將其添加到總和,然後將其刪除。它會重複此過程,直到所有數字都被刪除,並且數字爲0

1

這很簡單:

想象一下:

數= 54

它採用模來獲得這個由10

例如divded其餘54/10 = 5其餘4

它然後將這個數字(4)的結果,然後除以10(存儲小數轉換成int其丟棄)

所以然後數= 5

再次相同,5/10 = 0 5剩餘

添加他們togther,結果現在是9

,以此類推,直到數目爲0 :)

(在這種情況下,9是答案)

4

模數運算符提供除法的餘數。所以,MOD 10將成爲這個號碼中的一員。然後,除以10的整數將移動一切,以便可以重複。

舉例人數12345:

12345 % 10 = 5 
12345/10 = 1234 
1234 % 10 = 4 
1234/10 = 123 
    123 % 10 = 3 
    123/10 = 12 
    12 % 10 = 2 
    12/10 = 1 
    1 % 10 = 1 
    1/10 = 0 (loop ends) 

在每個模量的結果,執行除了所以你會得到5+4+3+2+1

+1

+1寫下來,這樣有人可以理解你在說什麼,不像我的答案:D – Charleh 2012-08-15 15:42:07