2014-11-02 48 views
-2

我正在研究這個項目,想知道是否有人可以幫助我。截至目前,我的程序工作在兩個相同的數字整數,但當涉及到兩個不同的數字時,我的程序變得瘋狂。看看我的代碼:試圖添加巨大的數字

這幾乎是這個項目的最後一部分,我會完成。我還沒有學會[arr1> arr2? blah:blah]呢。所以請不要提出這樣的建議。我想:

input: 500 
input2: 50 
output: 550 

input: 50 
input2: 500 
output: 550 

的Test1:

input: 500 
input2: 50 
output: 100 

我感謝你的幫助。

+8

「我的程序發瘋了」 - 不,它沒有。它根據您提供的說明進行完全合乎邏輯的事情。因爲它是*程序*。如果你需要幫助,你需要告訴我們它正在做什麼,確切地說。即你得到的是什麼,而不是你想要的輸出? – drewmoore 2014-11-02 23:07:43

+1

這看起來很複雜。爲什麼不將數組轉換爲整數,然後添加它們? – Michael 2014-11-02 23:08:35

+0

re:「爲什麼不將數組轉換爲整數」。這是一個相當不錯的股票作業問題。輸入可以是一個長度,所以你不能認爲這些數字會適合一個int(或者一個長的偶數,大多數的職業將會有一個特定的測試用例)。如果是家庭作業,只要使用BigInteger類,雖然它會打敗這一點。 – 2014-11-02 23:14:31

回答

0

最初的問題在我花時間編寫代碼並創建我自己的reverse,char2Integerpad函數時丟失了。但如果我記得它是在你的循環中,你試圖刪除領先的空白。無論如何,這是我到目前爲止,這似乎很好地工作:

public static void main(String[] args) 
{ 
    Scanner sc = new Scanner(System.in); 
    System.out.print("Input int1: "); 
    char[] firstInteger = sc.nextLine().toCharArray(); 
    System.out.print("Input int2: "); 
    char[] secondInteger = sc.nextLine().toCharArray(); 

    int[] num1 = char2Integer(firstInteger); 
    int[] num2 = char2Integer(secondInteger); 

    sum2(reverse(num1), reverse(num2)); //different length, assumed num1 is bigger 
} 

public static void sum2(int[] num1, int[] num2) 
{ 
    //int over = num1.length-num2.length; 
    int[] sum = new int[num1.length+1]; 
    //The pad function pads the array with 0 so there are no out of range exceptions 
    num1 = pad(num1, sum.length); 
    num2 = pad(num2, sum.length); 

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

     //if an element exceeds a value of 10 
     if (sum[i] >= 10) 
     { 
      sum[i] = sum[i]%10; 
      sum[i+1]++; 
     } 
    } 
    sum = reverse(sum); 
    for (int i = 0; i < sum.length; i++) 
     System.out.print(sum[i]); 
} 

而這裏是我爲你寫的墊功能。

public static int[] pad(int[] toPad, int length) 
{ 
    int[] returnArray = new int[length]; 
    int i; 
    for (i = 0; i < toPad.length; i++) 
     returnArray[i] = toPad[i]; 
    for (int j = i; j < returnArray.length; j++) 
     returnArray[j] = 0; 
    return returnArray; 
} 

它不會刪除前導零,我會把它留給你。我現在做不了所有的工作,我可以嗎?

+0

正是我想要的。完善!你是我的救星。謝謝。 – 2014-11-03 00:34:01

0

Editted的相關性
我將解釋什麼錯誤,你需要調整你的算法頗有幾分得到它正常工作。

你已經結束了= 1.你檢查j結束,這意味着你的循環將只運行一次(在這種情況下)。總和開始爲3位數字,然後您設置sum[0] = 0 + 0。總和現在是[0,0,0]。然後在下一個for循環中,檢查是否sum[2] == 0,如果它是增加sum [0] 1,不知道爲什麼。我想你實際上想繼續檢查零,直到第一個數字已經打印完畢,然後繼續打印包括零的所有數字。

0

簡單,但可以說是便宜的解決方案,使數量是相同的長度。 (這裏的示例代碼假設爲非負數)。

首先看其是較長的一個,和交換以便NUM1總是較長(如果它們不相等長度:

if(num2.length > num1.length) { 
    //this is only true if num2 is longer than num1. We just swap them using a temp 
    int[] temp; 
    int[] temp = num1; 
    num1 = num2; 
    num2 = num1; 
} 

使最大數量的長度的新陣列(num_temp) ,然後較短的墊用零拷貝到它,然後(結束語這一切的,如果(num1.length!= num2.length)將是觸摸清潔劑)。

int[] num_temp = new int[num1.length]; 
for(int i=0; i < num_temp.length; i++) { 
    if(i < num2.length) { 
     // if we are still within the actual number 
     num_temp[i] = num2[i]; 
    } else { 
     // we're beyond the actual number at this point, just pad with 0's 
     num_temp[i] = 0;  
    } 
} 
num2 = num_temp; //swap padded number in place. 

好了,現在你有兩個數字,num1和num2長度相同(如果需要,num2在前面用0填充)不知道它們是否完全修復你的代碼,但它基本上消除了數字長度與問題不同的情況。