2016-11-27 2 views
1

Я пытаюсь написать код для проблемы, которая включает в себя функцию, которая принимает входные числа как строки и возвращает оставшуюся часть этого ввода, когда делится на 7 как int.Ошибка выполнения при обработке больших чисел

Хотя код работает для небольших чисел, он запрашивает сообщение об ошибке выполнения при обработке больших чисел в качестве входных данных, представлены следующим образом ..

Runtime error time: 0.04 memory: 711168 signal:-1 

Exception in thread "main" java.lang.NumberFormatException: For input string: "5‌​449495" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580) 
    at java.math.BigInteger.<init>(BigInteger.java:470) 
    at java.math.BigInteger.<init>(BigInteger.java:597) 
    at Ideone.remainderWith7(Main.java:13) 
    at Ideone.main(Main.java:22) 

Мой код выглядит следующим образом ..

/* package whatever; // don't place package name! */ 

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone { 
    int remainderWith7(String num) { 
     // Your code here 
     java.math.BigInteger bg = new java.math.BigInteger(num); 
     //System.out.println(num); 
     Integer n = bg.intValue(); 
     return (int) n % 7; 
    } 

    public static void main(String[] args) throws java.lang.Exception { 
     // your code goes here 
     Ideone id = new Ideone(); 
     System.out.println(id.remainderWith7("56495654565052555054535456545355495650575755555757575350505‌​44949525452505653565‌​54949515453545151525‌​15050575749545453535‌​54954555157565253514‌​94949495155515455545‌​65555575452555157505‌​55557495050564952514‌​95051505752545155495‌​65156515750555450545‌​35549535551525149535‌​25654525554535154515‌​05251575251494956515‌​35255515450515553515‌​15657545054505357535‌​55654575549575349565‌​351575054")); 
    } 
} 
+0

Хорошо, что вы редактируете и указываете ошибку. Я только взглянул и увидел, что вы используете modulo после принуждения всего BigInteger. Сейчас я выяснил часть проблемы. – Makoto

+0

(_I_ фактически добавил конкретную ошибку после запуска ее самостоятельно) – qxz

+0

@qxz: Хорошо, спасибо за это. – Makoto

ответ

2

Как вы вставляете эту строку? Похоже, что он содержит много zero-width spaces и zero-width non-joiners.

Я говорю «выглядит»; на самом деле вы могли бы увидеть их только в том случае, если вы распечатали содержимое массива строки, либо с Arrays.toString, либо инкапсулируя эту длинную строку в переменную, или если вы проверили ее с помощью отладчика.

В конечном счете, это то, что ведет вас в заблуждение; Java пытается преобразовать эти символы Unicode в числа, и поскольку они не номеров, они конвертируются в -1. Вот почему ваш код ломается, и это также почему не сразу видно, почему он ломается. В этой строке больше символов, чем вы сразу же верили.

Исправление состоит в том, чтобы удалить эти символы из строки.

String num = ""; // enter your long number here; not repeating it for brevity's sake 
num = num.replace("\u200C", "").replace("\u200B", ""); 

Теперь вы можете вернуться к другим проблемам с кодом, например, не используя BigInteger.mod, когда вы хотите сделать по модулю (потому что доверять мне, используя % не собирается дать вам правильный ответ с целое число, такое же большое).

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