2014-11-02 4 views
0

Я делаю этот проект в java, который принимает два целочисленных значения (максимум 30 цифр) и складывает их вместе. Поскольку мне не разрешено использовать Big Integer или другой класс, я думал о том, чтобы взять их как строку, а затем преобразовать их в целые числа. Вот то, что я до сих пор:Добавление более 30 цифр

import java.util.*; 
public class Test{ 
    public static void main(String[] args){ 

    System.out.print("Input 1: "); 
    char[] firstInteger = myInput(); 
    System.out.print("Input 2: "); 
    char[] secondInteger = myInput(); 

    int[] num1 = char2Integer(firstInteger); 
    int[] num2 = char2Integer(secondInteger); 
    sum(num1, num2); 
    } 
    public static char[] myInput(){ 
     String numbers; 
     Scanner input = new Scanner(System.in); 
     numbers = input.nextLine(); 

     while(numbers.length() > 30){ 
      System.out.println("Please input valid integers with digits less than 30"); 
      numbers = input.nextLine(); 
     }return numbers.toCharArray(); 
    } 
    public static int[] char2Integer(char[] integer){ 
     int[] numbers = new int[integer.length+1]; 
     int j=integer.length-1; 

     for (int i = numbers.length-1; i>0 ; i--){ 
      if(j>-1){ 
       numbers[i] = (int)(integer[j]-'0'); 
       j--; 
      } 
     }return numbers; 
    } 
    public static void sum(int[] num1, int[] num2){ 
     int[] sum = new int[num1.length]; 

     for (int i = sum.length-1 ; i> 0; i--){ 
      sum[i] += num1[i]+num2[i]; 

      if(sum[i] >= 10){ 
       sum[i] = sum[i]%10; 
       sum[i-1]++; 
      } 
     } 
     for (int i = 0; i< sum.length; i++) 
      System.out.print(sum[i]); 
    } 
} 

Моя проблема сейчас: при добавлении массивов разной длины, я получаю странные ответы. (Добавление массивов одинаковой длины прекрасно работает.) Например:

input 1 = 50 
input 2 = 500 
output = 100 

и

input 1 = 50 
input 2 = 5 
output = java.lang.ArrayIndexOutOfBoundsException: 2 

Я попытался обратить вспять массивы затем добавить их, но я получаю outOfBoundsException: -1. Я также подумал о преобразовании более короткого массива в ту же длину, что и более длинный массив, но в моем коде будет много строк. Спасибо за помощь. Я буду принимать все положительные/отрицательные предложения.

ответ

0

Заполните короткое замыкание цифрой 0, чтобы она была такой же длины, как и более длинная.

например.

input 1 = 50 
input 2 = 5 

следует интерпретировать как 50 + 05

0

Да из-за этой линии

sum[i] += num1[i]+num2[i]; 

, если один из массива имеет больше длины, чем другие, вы имеете дело с ними, как они есть такой же длины всегда

2

Проверьте этот код для функции суммы.

public static void sum(int[] num1, int[] num2){ 
    int num1len = num1.length; 
    int num2len = num2.length; 

    int[] sum= new int[num1len>num2len?num1len:num2len]; 

    for (int i = sum.length-1 ; i> 0; i--){ 
     if(num1len>0) 
      sum[i] += num1[--num1len]; 

     if(num2len>0) 
      sum[i] += num2[--num2len]; 

     if(sum[i] >= 10){ 
      sum[i] = sum[i]%10; 
      sum[i-1]++; 
     } 
    } 
    for (int i = 0; i< sum.length; i++) 
     System.out.print(sum[i]); 
} 
0

Ваш вопрос в методе суммы, где вы не принимая во внимание о длине двух входных и даже LSB номер 1 получение суммируется с LSB числа 2:

public static void sum(int[] num1, int[] num2){ 
     int[] sum = new int[num1.length > num2.length ? num1.length : num2.length];//allocate for whoever is having more number of characters in input. 

     for (int i = num1.length-1, j = num2.length - 1, k = sum.length - 1 ; i> 0 || j > 0; i--, j--, k--){//take three variables one for each 
      sum[k] += num1[i]+num2[j]; 

      if(sum[k] >= 10){ 
       sum[k] = sum[k]%10; 
       sum[k-1]++; 
      } 
     } 
     for (int i = 0; i< sum.length; i++) 
      System.out.print(sum[i]); 
    } 
+0

по-видимому, я не Не знаете, как использовать [array.length> array2.length? array.length:] нотация ... можете ли вы просветить меня? –

+0

мы называем это тройной операцией. он работает как ((какое-то условие)? Если условие истинно, тогда выполняйте меня: иначе исполняйте меня). – SMA

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