2

我已经解决了项目 Euler 问题 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));

第一种方法的数学是如何工作的,这很酷,但我需要一些解释来帮助我理解,所以如果有人愿意向我解释,我将非常感激。

注意:如果我在错误的部分发布,请让我知道更好的提问位置。

4

5 回答 5

6

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

将数字视为一个列表,您只是将列表出列并对值求和。

于 2012-08-15T15:10:51.513 回答
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

于 2012-08-15T15:15:44.990 回答
2

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

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

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

于 2012-08-15T15:11:57.703 回答
1
  1. 他们找到了数字 2^1000。

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

  3. 除以 10 会去除最低有效位。EG 12034 / 10 = 1203

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

于 2012-08-15T15:11:42.743 回答
1

这很简单:

想象一下:

数字 = 54

它使用模数将余数除以 10

例如 54 / 10 = 5 余数 4

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

那么数字 = 5

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

将它们加在一起,结果现在是 9

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

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

于 2012-08-15T15:12:18.453 回答