这个C#代码如何解决答案?

这个C#代码如何解决答案?

问题描述:

我已经解决了项目欧拉问题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

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. 他们找到了数字2^1000。

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

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

  4. 他们总结了这些最不重要的数字。

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

number/10删除最不重要的十进制数字。这是有效的,因为C#中的整数除法将其余部分抛弃。例如12345 =>1234

因此,上面的代码提取每个数字,将其添加到总和,然后将其删除。它会重复此过程,直到所有数字都被删除,并且数字为0

这很简单:

想象一下:

数= 54

它采用模来获得这个由10

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

它然后将这个数字(4)的结果,然后除以10(存储小数转换成int其丢弃)

所以然后数= 5

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

添加他们togther,结果现在是9

,以此类推,直到数目为0 :)

(在这种情况下,9是答案)

模数运算符提供除法的余数。所以,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