2015-05-23 3 views
0

Так сегодня утром я написал метод для личного использования, который суммирует целые числа, приведенные в качестве аргументов:Совершенствование метода добавление BigIntegers

public class BigSum { 
    public static int sum(int... numbers) { 
     int sum = 0; 
     for(int n : numbers) { 
      sum += n; 
     } 
     return sum; 
    } 
} 

Позже оказалось, что ИНТ значение слишком мало для целей моей программы , поэтому я переключился на BigIntegers. Я решил, что это было бы проще, если метод взял строк в качестве аргументов, превратили их в BigIntegers и затем суммируется их:

import java.math.*; 

public class BigSum { 
    public static BigInteger sum(String... numbers) { 
     BigInteger sum = BigInteger.ZERO; 
     for(String n : numbers) { 
      BigInteger x = new BigInteger(n); 
      sum = sum.add(x); 
    } 
     return sum; 
} 
} 

Единственная проблема с этим кодом является то, что вам нужно привести аргументы в двойные кавычки (так как он принимает Строки), и это обычно очень неудобно. Что я могу сделать для sum метода принимать аргументы, как это:

BigInteger NUMBER = BigSum.sum(5, 6); 

Вместо:

BigInteger NUMBER = BigSum.sum("5", "6"); 

?

+2

Вы можете взять 'long' или' double'. Синтаксиса для литерала «BigInteger» нет. – Radiodef

ответ

0

Вы можете изменить свой класс, как это -

public static BigInteger sum(BigInteger... numbers) { 

    BigInteger sum = BigInteger.ZERO; 

    for(BigInteger n : numbers) { 
     BigInteger x = new BigInteger(n); 
     sum = sum.add(x); 
} 
+4

Если OP находит «BigSum.sum (« 5 »,« 6 »), неудобно, я уверен, что они находят« BigSum.sum (BigInteger.valueOf («5»), BigInteger.valueOf («6»)) 'еще более неудобно. –

+1

'BigInteger x = new BigInteger (n);' Что? Вы создаете новый 'BigInteger' из существующего' BigInteger', потому что ...? – Tom

3

Вы можете принять Object... в качестве аргументов и использовать toString() метод:

public static BigInteger sum(Object... numbers) { 
    BigInteger sum = BigInteger.ZERO; 
    for(Object n : numbers) { 
     BigInteger x = new BigInteger(n.toString()); 
     sum = sum.add(x); 
    } 
    return sum; 
} 
// ... 
BigInteger sum1 = BigSum.sum("5", 6); // 11 
// With a real big integer 
BigInteger sum2 = BigSum.sum("1234567891011121314151617181920", 1); 
// 1234567891011121314151617181921 

Этот код будет бросить NumberFormatException, если число не является действительное представление BigInteger.

+0

Это потребует, чтобы аргументы метода 'sum' были строковыми литералами, что именно то, что OP попросил избежать. – Bobulous

+0

Он отлично работает, но компилятор отказывается добавлять значения за пределы диапазона 'int'. Объект не может быть больше, чем 'int'? Я не понимаю. – shooqie

+0

@Bobulous Нет, вы можете передать String или int равнодушно. Я добавил пример. –

1

Перед тем, как прибегнуть к использованию BigInteger, убедитесь, что вы не можете просто использовать примитивный тип long. Тип long имеет гораздо большие значения, чем примитивный тип int и не требует накладных расходов на создание объектов BigInteger.

Однако, если ваши суммы будут расти до размеров за пределами возможностей long, но ваши отдельные части этого помещаются в long типа, то вы можете переключить метод принять массив long значений, а затем использовать BigInteger провести в общей сложности , Такой метод может выглядеть так:

public static BigInteger sum(long... numbers) { 
    BigInteger total = BigInteger.ZERO; 
    for(long number : numbers) { 
     total = total.add(BigInteger.valueOf(number)); 
    } 
    return total; 
} 
+0

Я долго думал, но его диапазон все еще слишком мал для меня. – shooqie

+0

Даже для комплектующих? – Bobulous

+0

Да, мне нужно что-то, что может хранить цифры с ~ 50 цифрами. – shooqie

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