Summing BigInteger Digits

I am trying to find the sum of the digits of the number 2^1000 and I am using Java BigInteger class for this. However, I could not make it real. Eventually, I get a 0 (zero) with the following code. What might be the problem?

Thanks...


After Kon's help I fixed the problem, but this time I get a wrong result. Can anyone see the problem with the algorithm?

public static void main(String []args) throws Exception
{
    BigInteger big = BigInteger.valueOf(2).pow(1000);
    BigInteger big2 = BigInteger.valueOf(0);


    //System.out.println(big);

    for(long i = 1; i<283; i++)
    {
         big2 = big2.add(big.mod(BigInteger.valueOf((long) Math.pow(10,i))).divide(BigInteger.valueOf((long)Math.pow(10,i-1))));
    }

    System.out.println(big2);
}

Upvotes: 4

Views: 7402

Answers (2)

Warlord
Warlord

Reputation: 2826

Trying to calculate each digit of BigInteger using mod is not very efficient, because of many method calls you are doing in the process. Instead you can simplify by doing the conversion to String and getting each digit straight away.

BigInteger big = BigInteger.valueOf(2).pow(1000);
String digits = big.toString();
int sum = 0;

for(int i = 0; i < digits.length(); i++) {
    int digit = (int) (digits.charAt(i) - '0');
    sum = sum + digit;
}

System.out.println(sum);

Upvotes: 3

Kon
Kon

Reputation: 10810

The BigInteger class is immutable, therefore you have to assign the result of the operation to the variable itself.

big2.add(big.mod(BigInteger.valueOf((long) Math.pow(10,i))).divide(BigInteger.valueOf((long)Math.pow(10,i-1))));

should become

big2 = big2.add(big.mod(BigInteger.valueOf((long) Math.pow(10,i))).divide(BigInteger.valueOf((long)Math.pow(10,i-1))));

For more on immutable objects in Java, please take a look at this documentation.

Also, although your question is not specifically about this, using hard coded literal values in your loops is very bad practice. You want to loop over each digit in the BigInteger 2^1000. Well, you could get the number of digits using something like big.toString().length().

Upvotes: 1

Related Questions