使用String添加大量

时间:2015-09-09 07:33:58

标签: java string

给定两个数字作为输入,返回数字的总和。请注意,数字可能非常大,因此以字符串

的形式提供

示例输入#1:

add("2354725234782357","9999999999999999999999999988888888888")

样本输出#1:

10000000000000000000002354714123671245

实现:

public String add(String str1, String str2) {

    int max = str1.length() > str2.length() ? str1.length() : str2.length();
    int n1[] = new int[max];
    int n2[] = new int[max];
    for (int i = 0; i < str1.length(); i++) {
        n1[i] = str1.charAt(str1.length() - 1 - i);

    }
    for (int i = 0; i < str2.length(); i++) {
        n2[i] = str2.charAt(str2.length() - 1 - i);
    }
    int carry = 0;
    int sum[] = new int[max + 1];
    int k = 0;
    for (k = 0; k < max; k++) {
        sum[k] = (n1[k] + n2[k] + carry) % 10;
        if ((n1[k] + n2[k] + carry) >= 10) {
            carry = 1;
        } else {
            carry = 0;
        }
    }
    sum[max] = carry;
    String result = "";
    return result;

}

我已经实现了我的逻辑,但我不知道如何将输出作为字符串。

4 个答案:

答案 0 :(得分:5)

为什么不使用BigInteger这更容易,仍然是原生java。

private static String add(String s1, String s2)
{
    BigInteger n1 = new BigInteger(s1);
    BigInteger n2 = new BigInteger(s2);
    return n1.add(n2).toString();
}

无论如何,您的代码中有一个错误。不要将char转换为int使用ascii值,这是错误的。用Character.getNumericValue();

解析它

如果您已完成此操作,则可以将sum数组以相反的顺序连接到字符串。

<强>解决方案:

public static String add(String str1, String str2) {

    int max = str1.length() > str2.length() ? str1.length() : str2.length();
    int n1[] = new int[max];
    int n2[] = new int[max];
    for (int i = 0; i < str1.length(); i++) 
    {
        // conver char to int
        n1[i] = Character.getNumericValue(str1.charAt(str1.length() - 1 - i));
    }
    for (int i = 0; i < str2.length(); i++) {
        // conver char to int
        n2[i] = Character.getNumericValue(str2.charAt(str2.length() - 1 - i));
    }
    int carry = 0;
    int sum[] = new int[max + 1];
    int k = 0;
    for (k = 0; k < max; k++) {
        sum[k] = (n1[k] + n2[k] + carry) % 10;
        if ((n1[k] + n2[k] + carry) >= 10) {
            carry = 1;
        } else {
            carry = 0;
        }
    }
    sum[max] = carry;
    // concat array in reverse order
    StringBuilder sb = new StringBuilder();
    for(int i = sum.length - 1; i >= 0; i--)
        sb.append(sum[i]);
    return sb.toString();
}

输入

add("2354725234782357","9999999999999999999999999988888888888")

输出

10000000000000000000002354714123671245

答案 1 :(得分:3)

您的代码中存在逻辑错误:您正在添加每个整数的char值而不是整数本身。您可以使用Character.getNumericValue(char ch)获取char的数值。

然后,您可以通过循环sum数组来构造结果String。循环必须以相反的顺序完成(以获得正确的顺序)。注意第一个值sum[max],如果它是0,我们不能将它添加到String中(否则,我们将得到一个用0填充的值):

public static String add(String str1, String str2) {
    int max = Math.max(str1.length(), str2.length());
    int n1[] = new int[max];
    int n2[] = new int[max];
    for (int i = 0; i < str1.length(); i++) {
        //n1[i] = str1.charAt(str1.length() - 1 - i);
        n1[i] = Character.getNumericValue(str1.charAt(str1.length() - 1 - i));
    }
    for (int i = 0; i < str2.length(); i++) {
        //n2[i] = str2.charAt(str2.length() - 1 - i);
        n2[i] = Character.getNumericValue(str2.charAt(str2.length() - 1 - i));
    }
    int carry = 0;
    int sum[] = new int[max + 1];
    int k = 0;
    for (k = 0; k < max; k++) {
        sum[k] = (n1[k] + n2[k] + carry) % 10;
        if ((n1[k] + n2[k] + carry) >= 10) {
            carry = 1;
        } else {
            carry = 0;
        }
    }
    sum[max] = carry;
    StringBuilder sb = new StringBuilder();
    if (sum[max] > 0) {
        sb.append(String.valueOf(sum[max]));
    }
    for (int i = max - 1; i >= 0; i--) {
       sb.append(String.valueOf(sum[i]));
    }  
    return sb.toString();
}

请注意,您也可以替换

int max = str1.length() > str2.length() ? str1.length() : str2.length();

int max = Math.max(str1.length(), str2.length());

答案 2 :(得分:0)

您可以使用StringBuilderint[]中的max的所有数字附加到0

StringBuilder sb = new StringBuilder();
for (int i=max; i>=0; i--)
{
   sb.append(String.valueOf(sum[i]));
}  
String result = sb.toString();

如果需要,您还可以改进此选项以跳过前导零:

boolean leadingZero = true;
StringBuilder sb = new StringBuilder();
for (int i=max; i>=0; i--)
{
   if (sum[i] != 0)
   {
        leadingZero=false;
   }
   if (!leadingZero)
   {
        sb.append(String.valueOf(sum[i]));
   }
}  
String result = sb.toString();

答案 3 :(得分:0)

我修改了一些代码:(你可以避免创建数组)

public static String add(String str1, String str2) {
    int carry=0;
    StringBuilder sum=new StringBuilder();

    int l1=str1.length();
    int l2=str2.length();

    while(l1>0 && l2>0){
        int s=Character.getNumericValue(str1.charAt(--l1))+Character.getNumericValue(str2.charAt(--l2))+carry;
        if(s<10){
           sum.append(s);
        }else{
            sum.append(s%10);
            carry=s/10;
        }

    }
    if(l2>0){
        while(l2>0){

             int s=Character.getNumericValue(str2.charAt(--l2))+carry;
                if(s<10){
                   sum.append(s);
                }else{
                    sum.append(s%10);
                    carry=s/10;
                }

        }


    }
    if(l1>0){
        while(l2>0){
             int s=Character.getNumericValue(str1.charAt(--l1))+carry;
                if(s<10){
                   sum.append(s);
                }else{
                    sum.append(s%10);
                    carry=s/10;
                }

        }
    }

    if(carry>0){
         sum.append(carry);
    }
    return sum.reverse().toString();

}