这个C#代码如何解决问题?

时间:2012-08-15 15:07:17

标签: c# math

我已经解决了项目欧拉问题16,但发现了这种相当新颖的方法,但我无法理解所采用的技术(来自http://www.mathblog.dk/project-euler-16/):

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

数学如何在第一种方法上运作,这很酷,但我需要一些解释来帮助我理解,所以如果有人会这么善意向我解释,我会非常感激。

注意:如果我在错误的部分发布,请告诉我更好的地方。

5 个答案:

答案 0 :(得分:6)

value % 10将返回最后一位数(除以10后的余数)。将整数除以10将删除此数字。

将数字视为列表,您只是将列表出列并将值相加。

答案 1 :(得分: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

答案 2 :(得分:2)

number % 10提取最低有效十进制数字。例如12345 => 5

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

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

答案 3 :(得分:1)

  1. 他们发现了数字2 ^ 1000。

  2. 模10获得最低有效数字。 例如。 12034%10 = 4

  3. 除以10条最低有效数字。 例如。 12034/10 = 1203

  4. 他们总结了这些最低有效数字。

答案 4 :(得分:1)

这很简单:

想象一下:

数= 54

它使用modulo将其余部分除以10

e.g。 54/10 = 5余数4

然后将该数字(4)添加到结果中,然后将数字除以10(存入int,丢弃小数位)

所以那么数字= 5

同样,5/10 = 0余数5

添加它们,结果现在是9

依此类推,直到数字为0:)

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