数字2 ^ 1000的数字总和是多少?

tra*_*ley 11 c# arbitrary-precision

这是一个问题,项目欧拉,而这个问题包括一些源代码,所以认为这您的扰流板警报,如果你有兴趣自己解决它.不鼓励为问题分配解决方案,这不是我想要的.我真诚地需要在正确的方向上进行一点点推动和指导.

问题如下:

2 ^ 15 = 32768,其数字之和为3 + 2 + 7 + 6 + 8 = 26.

数字2 ^ 1000的数字总和是多少?

我理解问题的前提和数学,但我一周前才开始练习C#,所以我的编程充其量只是摇摇欲坠.

我知道int,long和double绝对不足以准确地保持2 ^ 1000的300+(基数10)数字,所以需要一些策略.我的策略是设置一个逐个获取数字的计算,并希望编译器能够计算出如何计算每个数字而没有像overflow这样的错误:

using System;
using System.IO;
using System.Windows.Forms;

namespace euler016
{
    class DigitSum
    {
        // sum all the (base 10) digits of 2^powerOfTwo
        [STAThread]
        static void Main(string[] args)
        {
            int powerOfTwo = 1000;
            int sum = 0;

            // iterate through each (base 10) digit of 2^powerOfTwo, from right to left
            for (int digit = 0; Math.Pow(10, digit) < Math.Pow(2, powerOfTwo); digit++)
            {
                // add next rightmost digit to sum
                sum += (int)((Math.Pow(2, powerOfTwo) / Math.Pow(10, digit) % 10));
            }
            // write output to console, and save solution to clipboard
            Console.Write("Power of two: {0} Sum of digits: {1}\n", powerOfTwo, sum);
            Clipboard.SetText(sum.ToString());
            Console.WriteLine("Answer copied to clipboard. Press any key to exit.");
            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它似乎完全适用于powerOfTwo <34.我的计算器超出了有效数字,所以我无法测试更高的功率.但是跟踪程序,看起来没有发生溢出:计算的位数随着powerOfTwo = 1000的增加而逐渐增加,并且数字的总和也(平均)随着powerOfTwo的增加而增加.

对于我应该执行的实际计算,我得到输出:

2的幂:1000位数:1189

但1189不是正确的答案.我的计划有什么问题?我对所有建设性的批评持开放态度.

dbw*_*dbw 13

为了计算这些大数字的值,你不仅需要成为一名优秀的程序员,还需要一名优秀的数学家.这里有一个提示,有一个熟悉的公式x = e x ln a,或者如果你愿意,x = 10 x log a.

更具体到您的问题2 1000找到2 的公共(基数10)日志,并将其乘以1000; 这是10的幂.如果你得到10 53.142(53.142 = log 2值*1000) - 你最有可能 - 那么这就是10 53 x 10 0.142 ; 只评估10 0.142,你会得到1到10之间的数字; 并将其乘以10 53,但是这个10 53将没有用,因为53零和将仅为零.

用于C#中的日志计算

Math.Log(num, base);
Run Code Online (Sandbox Code Playgroud)

为了更准确,您可以使用Big Integer的Log和Pow功能.

现在休息编程帮助我相信你可以从你身边.


lui*_*s90 9

正常int无法帮助你这么大的数字.不是long.它们从未被设计用于处理如此巨大的数字.int可存储大约10位数字(最大值为:)2,147,483,647long大约19位数字(最大值为9,223,372,036,854,775,807).但是,内置Windows计算器的快速计算告诉我2^1000数字超过300位.

(边注:可以从所获得的精确值int.MAX_VALUElong.MAX_VALUE分别)

因为你想要精确的数字总和,偶数floatdouble类型将不起作用,因为它们只存储少数到几十个数字的有效数字.(7浮点数,15-16双数位).有关浮点表示,双精度的更多信息,请阅读此处

但是,C#提供了BigInteger任意精度的内置算法 ,它应该适合您的(测试)需求.即可以任意数量的数字进行算术运算(理论上当然.实际上它实际上受到物理机器内存的限制,并且取决于你的CPU功率也需要时间)


回到你的代码,我认为问题出在这里

Math.Pow(2, powerOfTwo)

这溢出了计算.嗯,不是真的,但double正如我所说,精确度并不能准确地代表结果的实际价值.

  • 这可能不是最有效的解决方案,但我接受它,因为它是我正在寻找的:它表明我的程序的问题,并显示如何修复它.它不直接提供源代码.最后,生成的程序运行时间非常短,在我的中等机器上大约1毫秒.我确信有一些选择可以通过不同方式提取的数学块,但我很满意这样做. (2认同)