2016-10-14 60 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

好吧,我修改了回答以解释长字符串。它比其他答案还少代码。 –

相关问题