2011-02-14 4 views
2

Я хочу использовать большое целочисленное значение в моем состоянии while while, но это не работает.Использование BigIntegers как условие во время цикла в Java

import java.util.Scanner; 
import java.util.StringTokenizer; 
public class NiceProbelm2 { 
public static void main(String[]args){ 
    Scanner input = new Scanner(System.in); 
    String number = input.nextLine(); 
    StringTokenizer st = new StringTokenizer(number); 
    BigInteger base = null; 
    int power=0; 
    while (st.hasMoreTokens()) { 
      String token1 = st.nextToken(); 
      String token2 = st.nextToken(); 
      base = new BigInteger(token1); 
      power = Integer.parseInt(token2); 


     } 

     BigInteger result = base.pow(power); 
     //long fresult = (long)result; 
     BigInteger div = new BigInteger("10"); 
     System.out.println(result); 
     BigInteger sum=null; 
    //NOt working while(result.compareTo(new BigInteger("0")) > 10) 
        { 
     BigInteger digit = result.mod(div); 
     result = result.divide(div); 
     sum = sum.add(digit); 

    } 
    System.out.println(sum); 
} 

}

+1

Не могли бы вы дать нам некоторые примеры входы, выходы и ожидаемые результаты. Трудно понять, в чем проблема, не зная, в чем проблема. :) – Shaded

+0

Вход: 1234567 8 выход: 5396563761318393964062660689603780554533710504641 вывод: сумма всех вышеперечисленных номеров, равная 217 –

+0

Вам нужно сообщить нам, что * на самом деле * получает выход! – Gabe

ответ

1

Я думаю, что проблема с предыдущими решениями заключалась в том, что вы указали нулевой указатель, потому что ваш аккумулятор не был инициализирован. Следующий код выдает результат, который вы ищете:

 BigInteger result = base.pow(power); 
     BigInteger div = new BigInteger("10"); 
     System.out.println(result); 
//The following line is different, initialize the sum before using it. 
     BigInteger sum = BigInteger.ZERO; 
     while(!BigInteger.ZERO.equals(result)) { 
      BigInteger digit = result.mod(div); 
      result = result.divide(div); 
      sum = sum.add(digit); 
     } 
     System.out.println(sum); 

Я также хотел бы отметить, что BigInteger имеет метод, который обеспечивает как частное и остаток от одного подразделения, которое более эффективно, чем делать их как по отдельности и есть метод «valueOf» для BigInteger, так что вы можете использовать числовой литерал вместо строки:

BigInteger result = base.pow(power); 
    BigInteger div = BigInteger.valueOf(10); 
    System.out.println(result); 

    //Initialize the sum to zero 
    BigInteger sum = BigInteger.ZERO;   
    //While the result has a non-zero decimal digit 
    while(!BigInteger.ZERO.equals(result)) { 
     //this divides by ten (first element), 
     //and calculates the remainder (second element) 
     BigInteger[] lastDigit = result.divideAndRemainder(div); 
     result = lastDigit[0]; 
     sum = sum.add(lastDigit[1]); 

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

Вы гуру много благодарны. Я также рассмотрю другие предложения. –

7

Вы никогда не должны сравнивать возвращаемое значение compareTo() ни к чему, кроме 0. (BigInteger.compareTo() является немного более конкретными, но то же самое правило все еще применяется)

Вы можете проверить, если он больше 0, меньше 0 или равен 0. Только эти 3 части информации действительно актуальны. Фактическое значение (если оно возвращает 1 или 10 или 100) не имеет значения.

1

Вы должны использовать это условие:

result.compareTo(BigInteger.ZERO) > 0 
0

Похоже, что вы хотите сделать while (result != 0), которые можно было бы написать, как
while (result.compareTo(BigInteger.ZERO) != 0)

Кроме того, вы должны инициализировать sum в BigInteger.ZERO.

+0

Спасибо за ваши предложения, но ни одно из вышеперечисленных работ не работает. То, что я хочу сделать, - это когда я беру на себя силу числа, например. 1234567^8 дает мне очень длинное число, поэтому я принимаю по модулю номер, чтобы я мог получить цифры один за другим и добавить их. Ваши предложения выше дали мне те же результаты, что и раньше. Цикл while, содержащий большой целочисленный аргумент, не выполняется. –

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