What is the sum of the digits of the number 2^1000?

前端 未结 10 1836
别跟我提以往
别跟我提以往 2021-01-02 03:13

This is a problem from Project Euler, and this question includes some source code, so consider this your spoiler alert, in case you are interested in solving it yourself. It

相关标签:
10条回答
  • 2021-01-02 03:23

    Normal int can't help you with such a large number. Not even long. They are never designed to handle numbers such huge. int can store around 10 digits (exact max: 2,147,483,647) and long for around 19 digits (exact max: 9,223,372,036,854,775,807). However, A quick calculation from built-in Windows calculator tells me 2^1000 is a number of more than 300 digits.

    (side note: the exact value can be obtained from int.MAX_VALUE and long.MAX_VALUE respectively)

    As you want precise sum of digits, even float or double types won't work because they only store significant digits for few to some tens of digits. (7 digit for float, 15-16 digits for double). Read here for more information about floating point representation, double precision

    However, C# provides a built-in arithmetic BigInteger for arbitrary precision, which should suit your (testing) needs. i.e. can do arithmetic in any number of digits (Theoretically of course. In practice it is limited by memory of your physical machine really, and takes time too depending on your CPU power)


    Back to your code, I think the problem is here

    Math.Pow(2, powerOfTwo)

    This overflows the calculation. Well, not really, but it is the double precision is not precisely representing the actual value of the result, as I said.

    0 讨论(0)
  • 2021-01-02 03:34

    since the question is c# specific using a bigInt might do the job. in java and python too it works but in languages like c and c++ where the facility is not available you have to take a array and do multiplication. take a big digit in array and multiply it with 2. that would be simple and will help in improving your logical skill. and coming to project Euler. there is a problem in which you have to find 100! you might want to apply the same logic for that too.

    0 讨论(0)
  • 2021-01-02 03:35
    BigInteger bi= new BigInteger("2"); 
    bi=bi.pow(1000); 
    // System.out.println("Val:"+bi.toString()); 
    String stringArr[]=bi.toString().split(""); 
    int sum=0; 
    for (String string : stringArr) 
    { if(!string.isEmpty()) sum+=Integer.parseInt(string); } 
    System.out.println("Sum:"+sum);
    ------------------------------------------------------------------------
    output :=> Sum:1366
    
    0 讨论(0)
  • 2021-01-02 03:37

    A solution without using the BigInteger class is to store each digit in it's own int and then do the multiplication manually.

    static void Problem16()
    {
        int[] digits = new int[350];
    
        //we're doing multiplication so start with a value of 1
        digits[0] = 1;
        //2^1000 so we'll be multiplying 1000 times
        for (int i = 0; i < 1000; i++)
        {
            //run down the entire array multiplying each digit by 2
            for (int j = digits.Length - 2; j >= 0; j--)
            {
                //multiply
                digits[j] *= 2;
                //carry
                digits[j + 1] += digits[j] / 10;
                //reduce
                digits[j] %= 10;
            }
        }
    
        //now just collect the result
        long result = 0;
        for (int i = 0; i < digits.Length; i++)
        {
            result += digits[i];
        }
    
        Console.WriteLine(result);
        Console.ReadKey();
    }
    
    0 讨论(0)
  • 2021-01-02 03:37

    This is not a serious answer—just an observation.

    Although it is a good challenge to try to beat Project Euler using only one programming language, I believe the site aims to further the horizons of all programmers who attempt it. In other words, consider using a different programming language.

    A Common Lisp solution to the problem could be as simple as

    (defun sum_digits (x)
        (if (= x 0)
            0
            (+ (mod x 10) (sum_digits (truncate (/ x 10))))))
    
    (print (sum_digits (expt 2 1000)))
    
    0 讨论(0)
  • 2021-01-02 03:44

    I used bitwise shifting to left. Then converting to array and summing its elements. My end result is 1366, Do not forget to add reference to System.Numerics;

    BigInteger i = 1;
             i = i << 1000;
            char[] myBigInt = i.ToString().ToCharArray();
            long sum = long.Parse(myBigInt[0].ToString());
            for (int a = 0; a < myBigInt.Length - 1; a++)
            {
                sum += long.Parse(myBigInt[a + 1].ToString());
            }
            Console.WriteLine(sum);
    
    0 讨论(0)
提交回复
热议问题