Выполняя с другом несколько тестов по поводу класса BigInteger на Java, он создал код, который печатает «n:» и получает заданное число, чтобы найти его факториал.Через некоторое время я попытался вычислить факториал в 1 000 000, но затем (после нескольких минут вычислений) консоль показала только много нулей, даже без вывода на печать «n:», который выводится при запуске программы и «n!: "когда отображается результат.
В тестах, до 300k, код работал нормально (за исключением времени до вычисления, но это не соответствует ожиданиям, учитывая числа).Obs .: цикл используется для разделения строк, так как они поддерживают только 4096 символов
public static BigInteger zero = new BigInteger("0");
public static BigInteger one = new BigInteger("1");
public static BigInteger minusOne = new BigInteger("-1");
public static BigInteger fat(BigInteger n) {
if(n.equals(zero)) {
return new BigInteger("1");
}
BigInteger i = new BigInteger(n.toString());
while(!i.equals(one)) {
i = i.add(minusOne);
n = n.multiply(i);
}
return new BigInteger(n.toString());
}
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
System.out.print("n: ");
BigInteger bigInt = new BigInteger(in.nextLine());
String bigString = fat(bigInt).toString();
int strSize = bigString.length();
System.out.println("n! = ");
for (int i = 0; i < strSize; i++) {
if((i+1)%4096==0) {
System.out.printf("%c\n",bigString.charAt(i));
}else {
System.out.print(bigString.charAt(i));
}
}
in.close();
}
}
Предположительно, должен был произойти некоторый вывод, только не связка нулей и, очевидно, перезапись первого отпечатка.Даже с большими числами, такими как 300k, отпечатки «n:» и «n !:» остались там.Нет сообщений об ошибках переполнения или переполнения стека.В какой-то момент я подумал, что консоль показывает только последнюю часть номера, но, спросив друга, он сказал о какой-то неизвестной ошибке консоли или Eclipse (по крайней мере, для нас).