2013-11-23 4 views
0

У меня проблемы с Project Euler, и я наткнулся на проблему. Я понятия не имею, почему этот алгоритм не работает для 2^1000. Он работает для чисел в диапазоне 10^1 и 10^8 (те, которые я тестировал), но он должен работать для любого возможного диапазона.Сумма цифр

2^1000 - 1.07 * 10^301. Верхний предел двойника лежит на более или менее 10^308, поэтому число все еще находится в зоне действия.

import java.lang.Math; 

public class Euler15 { 
    public static void main(String[] args) { 


     int count = 0; 
     double res = Math.pow(2,1000); 

     for(int i = 301; i >= 0; i--){ 
      if (res == 0){ 
       break; 
      } 
      while (res >= Math.pow(10, i)){ 
       res-= Math.pow(10, i); 
       System.out.println(res); 
       count++; 
      } 
     } 

    System.out.println(count); 
} 
} 
+0

Потому что 2^1000 - путь к большому! – Ranveer

+0

Вероятно, проблема округления. – wvdz

+0

Просто потому, что он находится в диапазоне 'double', это не означает, что вы получаете все цифры до единиц. –

ответ

2

2^1000 - путь к большим для обычных типов данных. Используйте BigInteger или строки.

import java.math.BigInteger; 

Возьмите вход как BigInteger:

BigInteger n = BigInteger.valueOf(2); 

Теперь включите его до 1000:

n = n.pow(1000); 

Теперь, преобразовать его в строку, используя toString(), а затем добавьте каждый символ к вашему результату, изменив его на int. Это должно сделать это.

Смежные вопросы