2016-10-14 62 views
0

給定兩個表示爲字符串的非負數num1和num2,返回num1和num2的和。添加存儲在字符串變量中的數字

既NUM1和NUM2的長度小於5100

兩個NUM1和NUM2僅包含數字0-9。

num1和num2都不包含任何前導零。

您不能使用任何內置BigInteger庫或將輸入直接轉換爲整數。

我試過我的解決方案,但它不起作用。建議?

public class Solution { 
    public String addStrings(String num1, String num2) { 
     double multiplier = Math.pow(10, num1.length() - 1); 
     int sum = 0; 

     for (int i = 0; i < num1.length(); i++){ 
      sum += ((((int) num1.charAt(i)) - 48) * multiplier); 
      multiplier /= 10; 
     } 

     multiplier = Math.pow(10, num2.length() - 1); 

     for (int i = 0; i < num2.length(); i++){ 
      sum += ((((int) num2.charAt(i)) - 48) * multiplier); 
      multiplier /= 10; 
     } 

     return "" + sum; 
    }  
} 
+2

請給出一個示例輸入和示例輸出。 –

+1

您正在從左到右添加數字,而不是反之。您沒有添加前一階段的進位。你使用'int'作爲總和,但是你的輸入可以是> 5000數字? – TDG

回答

5

不得使用任何內置的BigInteger庫或轉換輸入直接整數

請注意,您要添加兩個整數,每個數字最多爲5100個。那不是最大,但最大位數

一個int(您的sum變量)不能保存這樣的值。 BigInteger可以,但你不能使用它。

因此,像在紙上那樣添加數字:添加最後的數字,將總和的低位數字寫爲結果的最後一位,並在需要時結轉一個數字。重複倒數第二位,倒數第三位等,直到完成。

由於總和將最長輸入值的數字的至少的數量,並且可以一個更長的時間,應該分配最長輸入加一的長度的char[]。完成後,使用String(char[] value, int offset, int count)構建最終字符串,根據需要使用偏移量0或1。

-1

對於問題的理解的緣故

你的方法的名稱是此外

你正在嘗試做一個功率運行但結果存儲在一個名爲變量乘法 ...

有多種原因導致代碼不起作用...

你需要做這樣的事情

Integer.parseInt(string) 

爲了解析字符串爲整數

這裏oficial doc

+0

*「您不能將輸入直接轉換爲整數」*表示不允許使用「Integer.parseInt(string)」。此外,該方法將崩潰和燒傷如果給定的超過10個位數的輸入,以及輸入可以高達5100 **位長**:*「的**既NUM1和NUM2的長度**是<5100」 * – Andreas

3

這個問題的目的是爲了在字符串表單中添加數字。您不應該嘗試將字符串轉換爲整數。說明中說明數字的長度可以達到5100位數字。所以這些數字太大而不能存儲在整數和雙精度中。例如在下面一行:

double multiplier = Math.pow(10, num1.length() - 1); 

您正在試圖存儲10^5100在double。在IEEE 754 binary floating point standard a double可以存儲從±4.94065645841246544e-324±1.79769313486231570e+308的編號。所以你的號碼不適合。它會變成Infinity。即使它適合於double它也不會準確,並且在後續計算中會遇到一些錯誤。

因爲問題指定不使用BigInteger或類似的庫,所以您應該嘗試並自己實現字符串添加。

這是非常簡單的,只是實現您在紙上添加兩個數字時遵循的確切算法。

+1

偉大的思想家都認爲:我們都建議你在紙上做這件事。 :-) – Andreas

+0

@Andreas我建議最後一個人在紙上也是這樣:) [鏈接](http:// stackoverflow。com/questions/39948155/explain-c-code-for-adding-two-strings#comment67177268_39948155) – Tempux

+0

@Tempux我總是想知道'double'可以用來存儲和檢索128位整數嗎?由於沒有容器來存儲傳統語言的128位整數。在'double'中存儲IPv6會很有用:) –

2

下面是使用char數組作爲中間容器添加兩個字符串而不使用BigInteger的工作示例。 @Tempux回答說明瞭爲什麼double無法使用。這裏的邏輯與在紙上添加兩個數字相似。

public String addStrings(String num1, String num2) { 
    int carry = 0; 
    int m = num1.length(), n = num2.length(); 
    int len = m < n ? n : m; 
    char[] res = new char[len + 1]; // length is maxLen + 1 incase of carry in adding most significant digits 
    for(int i = 0; i <= len ; i++) { 
     int a = i < m ? (num1.charAt(m - i - 1) - '0') : 0; 
     int b = i < n ? (num2.charAt(n - i - 1) - '0') : 0; 
     res[len - i] = (char)((a + b + carry) % 10 + '0'); 
     carry = (a + b + carry)/10; 
    } 
    return res[0] == '0' ? new String(res, 1, len) : new String(res, 0, len + 1); 
} 

這個片段是比較小的,精確的,因爲在這裏我沒有一成不變String這是複雜/凌亂的發揮併產生較大的代碼。還有一種直覺是 - 沒有比max(num1_length, num2_length) + 1獲得更大輸出的方法,這使得實現變得簡單。

0

你必須另外,你在紙上

不能使用BigInteger和字符串長度爲5100做的,所以你不能使用int或長加法。 你必須使用簡單的添加,因爲我們在紙上做。

class AddString 
{ 
public static void main (String[] args) throws java.lang.Exception 
{ 
    String s1 = "98799932345"; 
    String s2 = "99998783456"; 
    //long n1 = Long.parseLong(s1); 
    //long n2 = Long.parseLong(s2); 
    System.out.println(addStrings(s1,s2)); 
    //System.out.println(n1+n2); 
} 
public static String addStrings(String num1, String num2) { 
    StringBuilder ans = new StringBuilder(""); 
    int n = num1.length(); 
    int m = num2.length(); 
    int carry = 0,sum; 
    int i, j; 
    for(i = n-1,j=m-1; i>=0&&j>=0;i--,j--){ 
     int a = Integer.parseInt(""+num1.charAt(i)); 
     int b = Integer.parseInt(""+num2.charAt(j)); 
     //System.out.println(a+" "+b); 
     sum = carry + a + b; 
     ans.append(""+(sum%10)); 
     carry = sum/10; 
    } 
    if(i>=0){ 
     for(;i>=0;i--){ 
      int a = Integer.parseInt(""+num1.charAt(i)); 
      sum = carry + a; 
      ans.append(""+(sum%10)); 
      carry = sum/10; 
     } 
    } 
    if(j>=0){ 
     for(;j>=0;j--){ 
      int a = Integer.parseInt(""+num2.charAt(j)); 
      sum = carry + a; 
      ans.append(""+(sum%10)); 
      carry = sum/10; 
     } 
    } 
    if(carry!=0)ans.append(""+carry); 
    return ans.reverse().toString(); 
} 
} 

可以運行上面的代碼,看看它在所有的情況下,這可能是寫在更緊湊的方式,但是這將是很難理解你。

希望它有幫助!

0

你可以使用這個一個是獨立的整數或BigInteger的方法

public String addStrings(String num1, String num2) { 
    int l1 = num1.length(); 
    int l2 = num2.length(); 
    if(l1==0){ 
     return num2; 
    } 
    if(l2==0){ 
     return num1; 
    } 
    StringBuffer sb = new StringBuffer(); 
    int minLen = Math.min(l1, l2); 
    int carry = 0; 
    for(int i=0;i<minLen;i++){ 
     int ind = l1-i-1; 
     int c1 = num1.charAt(ind)-48; 
     ind = l2-i-1; 
     int c2 = num2.charAt(ind)-48; 
     int add = c1+c2+carry; 
     carry = add/10; 
     add = add%10; 
     sb.append(add); 
    } 

    String longer = null; 
    if(l1<l2){ 
     longer = num2; 
    } 
    else if(l1>l2){ 
     longer = num1; 
    } 
    if(longer!=null){ 
     int l = longer.length(); 
     for(int i=minLen;i<l;i++){ 
      int c1 = longer.charAt(l-i-1)-48; 
      int add = c1+carry; 
      carry = add/10; 
      add = add%10; 
      sb.append(add); 
     } 
    } 
    return sb.reverse().toString(); 
} 
-1

以前的解決方案有多餘的代碼。這是你需要的。

class ShortStringSolution { 
    static String add(String num1Str, String num2Str) { 
     return Long.toString(convert(num1Str) + convert(num2Str)); 
    } 

    static long convert(String numStr) { 
     long num = 0; 
     for(int i = 0; i < numStr.length(); i++) { 
      num = num * 10 + (numStr.charAt(i) - '0'); 
     } 
     return num; 
    } 
} 

class LongStringSolution { 

    static String add(String numStr1, String numStr2) { 
     StringBuilder result = new StringBuilder(); 
     int i = numStr1.length() - 1, j = numStr2.length() - 1, carry = 0; 
     while(i >= 0 || j >= 0) { 
      if(i >= 0) { 
       carry += numStr1.charAt(i--) - '0'; 
      } 
      if(j >= 0) { 
       carry += numStr2.charAt(j--) - '0'; 
      } 
      if(carry > 9) { 
       result.append(carry - 10); 
       carry = 1; 
      } else { 
       result.append(carry); 
       carry = 0; 
      } 
     } 
     if(carry > 0) { 
      result.append(carry); 
     } 
     return result.reverse().toString(); 
    } 
} 

public class Solution { 

    static String add(String numStr1, String numStr2) { 
     if(numStr1.length() < 19 && numStr2.length() < 19) { 
      return ShortStringSolution.add(numStr1, numStr2); 
     } 
     return LongStringSolution.add(numStr1, numStr2); 
    } 
} 
+0

這個問題表明這個數字可以有超過5000個數字。您的程序會因較小的輸入而失敗。 – TDG

+0

好吧,我修改了回答以解釋長字符串。它比其他答案還少代碼。 –

相關問題