有没有办法找到100的数字总和!?

Ash*_*dav 13 c++ algorithm

我知道有一种方法可以使用Python找到100个数字的总和!(或任何其他大数字的阶乘).但是我觉得在C++方面真的很难,因为即使是LONG LONG的规模还不够.

我只是想知道是否还有其他方法.

我知道它是不可能的,因为我们的处理器通常是32位.我所指的是其他一些棘手的技术或算法,可以使用相同的资源完成相同的工作.

Ola*_*the 16

使用带有标准的纸上乘法方法的数字数组.例如,在C中:

#include <stdio.h>

#define DIGIT_COUNT 256

void multiply(int* digits, int factor) {
  int carry = 0;
  for (int i = 0; i < DIGIT_COUNT; i++) {
    int digit = digits[i];
    digit *= factor;
    digit += carry;
    digits[i] = digit % 10;
    carry = digit / 10;
  }
}

int main(int argc, char** argv) {
  int n = 100;

  int digits[DIGIT_COUNT];
  digits[0] = 1;
  for (int i = 1; i < DIGIT_COUNT; i++) { digits[i] = 0; }

  for (int i = 2; i < n; i++) { multiply(digits, i); }

  int digitSum = 0;
  for (int i = 0; i < DIGIT_COUNT; i++) { digitSum += digits[i]; }
  printf("Sum of digits in %d! is %d.\n", n, digitSum);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 我可能会迟到评论,但我仍然不知道为什么OP不接受这个作为解决方案.这很简单,干净,独创性充其量(基本上是将每个数字作为数组元素进行纸张乘法以处理bignum问题.当其他人正在使用bignum和任意精度库时,这个解决方案因其简单而又惊人而独树一帜有效性(我认为这将是O(N)解决方案).为什么这种情况如此悄然被忽视,当人们评论许多微不足道的"仅仅是为了它"的答案时,一般都没有注释.悲伤. (5认同)

Man*_*j R 14

你怎么会找到100的数字之和!如果计算100!首先,然后找到总和,然后是什么意思.您将不得不使用一些智能逻辑来找到它而不实际计算100!删除所有五个因子,因为它们只会添加零.从这个方向思考,而不是考虑大数字.此外,我确信最后的答案,即数字的总和将在LONG LONG内.

有C++大型int库,但我认为这里的重点是算法而不是库.


Dou*_*oug 6

如果您指的是Project Euler问题,那么我对它的解读是它希望您编写自己的任意精度整数库或可以乘以数字的类.

我的建议是存储一个数字的10位数字,与你正常编写它们的方式相反,因为无论如何你最终都需要将数字转换为10.在我看来,以相反的顺序存储数字使得添加和乘法程序稍微容易一些.然后编写加法和乘法例程,模拟如何手动添加或乘以数字.

  • 我不知道Project Euler是什么,所以如果你是对的,那么你可能对性能要求有了更多的了解,但IMO如果他只是从Python学习C++,并且使用它作为练习,他可能做得比将ASCII编码的数字转换为std :: string.获得一个有效的乘法算法比有效的数据表示更重要,一个熟悉的类型可以增长并且可以简单地显示它有一些好处.一次做一个数字就可以很容易地处理算法中的进位 - 无需在数据结构中保留空间. (3认同)
  • 我发现使用整数向量更简单,每个整数向量只使用一半的位(如果使用64位整数,每个元素只存储32位),这样就可以保证不存在溢出任何操作.然后,可以首先在每个子元素处执行每个操作,然后可以按顺序方式对对象进行标准化. (2认同)
  • @DavidRodríguez - dribeas - 我同意,这种方式通常更好,特别是如果内存使用或计算速度很重要.但是在这个特定的情况下,如果您想要的只是基数10中的数字之和,但是您有效地将它们存储在其他基数中,那么您还必须编写除法或基本转换函数. (2认同)

Pra*_*rav 6

long long不是C++的一部分.g ++将其作为扩展名提供.

Arbitrary Precision Arithmetic是您正在寻找的东西.查看维基页面中给出的伪代码.

而且long long不能存储如此大的值.因此,您可以创建BigInteger类,也可以使用GMPC++ BigInteger等第三方库.

  • C++ 0x有一个"long`long`,借用了C,它在十多年前将其纳入标准. (2认同)

abe*_*nky 5

观察到将任何数字乘以10100不会改变数字的总和.

一旦你意识到这一点,看到乘以2和5,或乘以20和50,也不会改变总和,因为2x5 = 1020x50 = 1000.

然后请注意,当你的当前计算以0结束时,你可以简单地除以10,并继续计算你的阶乘.

再做一些关于快捷方式的观察,以消除1到100之间的数字,我认为您可以将答案纳入标准整数.

  • 我应该撤回这个答案.在今天使用几个"快捷方式"之后,我还没有找到可行的解决方案.我查看了Euler#20发布的解决方案,每个人似乎都使用了一个或多个类别的BigNum库.我不再相信这个问题可以在UInt64中解决.有人能告诉我它可以吗? (2认同)