【问题标题】:Loop to add string of number循环添加数字字符串
【发布时间】:2020-03-19 12:54:29
【问题描述】:

我尝试添加一个练习

String nb = "135";
String nb2 = "135";

结果应该是"270"的字符串

我不知道该怎么做...我尝试创建一个 for 循环并添加:nb.charAt(i) + nb2.charAt(i) 但没有成功,我不知道我与结转有什么关系。

编辑:我尽量不使用IntegerBigInteger,只使用String 这就是我尝试使用for 循环的原因。

感谢提供线索。

【问题讨论】:

  • 你必须对字符串中的所有数字求和还是简单地将字符串转换为数字并求和?
  • 从后到前保持进位。
  • 字符串的最大长度可以是多少?
  • nb.charAt(i) + nb2.charAt(i) 不会做你认为它会做的事情。
  • @vivek_23 没有最大长度

标签: java string algorithm integer


【解决方案1】:

字符串 str = "";

// Calculate length of both String  
int n1 = nb.length(), n2 = nb2.length();  
int diff = n2 - n1;  

// Initially take carry zero  
int carry = 0;  

// Traverse from end of both Strings  
for (int i = n1 - 1; i>=0; i--)  
{  
    // Do school mathematics, compute sum of  
    // current digits and carry  
    int sum = ((int)(nb.charAt(i)-'0') +  
        (int) nb2.charAt(i+diff)-'0') + carry);  
    str += (char)(sum % 10 + '0');  
    carry = sum / 10;  
}  

// Add remaining digits of nb2[]  
for (int i = n2 - n1 - 1; i >= 0; i--)  
{  
    int sum = ((int) nb2.charAt(i) - '0') + carry);  
    str += (char)(sum % 10 + '0');  
    carry = sum / 10;  
}  

// Add remaining carry  
if (carry > 0)  
    str += (char)(carry + '0');  

// reverse resultant String 
return new StringBuilder(str).reverse().toString();

【讨论】:

  • 太棒了,这正是我想要做的,非常感谢。
  • @samuel - 这个程序有问题。尝试添加3270270 会失败并显示StringIndexOutOfBoundsException。你检查我的答案了吗?
  • @ArvindKumarAvinash 更大的数字应该被交换,如果你添加 270 + 3270 这将起作用一个简单的交换就可以做到这一点......这是一个简单的猜测......哈哈
  • @SHIVANSHNARAYAN 可能很容易猜到,但通常关于 SO 的答案需要完整,以便其他人可以从中学习。我这样说是因为他们阅读答案下方的 cmets 的机会非常小。
  • @vivek_23 肯定会进行编辑。但我也建议多阅读 cmets,因为它们也很有帮助
【解决方案2】:

试试下面的sn-p:

String s1 = "135";
    String s2 = "135";
    String result = Integer.toString (Integer.parseInt(s1)+Integer.parseInt(s2));

【讨论】:

  • 如果字符串长度为 100 怎么办?
  • 谢谢,但我尽量不要使用IntegerBigInteger,只有String 这就是我尝试使用for 循环的原因
  • Integer.parseInt 会给你一个int,而不是Integer
  • @Slackow OP的意思是他不能使用Integer类中的方法,因为这可能是一道作业题。
【解决方案3】:

尝试使用 Integer.parseInt(nb.charAt(i)) + Integer.parseInt(nb2.charAt(i)) 将 char 转换为 int

【讨论】:

  • 如果字符串长度为 100 怎么办?
【解决方案4】:

你可以使用Character.numericValue给你一个字符的整数值,这可能会帮助你编写方法。如果没有数值,此方法还将返回 -1 或如果它像 1/2 的字符一样是小数,则返回 -2

【讨论】:

    【解决方案5】:

    您需要将字符串转换为数字才能添加它们。让我们使用BigInteger,以防万一数字真的很大:

    String nb  = "135";
    String nb2 = "135";
    
    BigInteger num1 = new BigInteger(nb);
    BigInteger num2 = new BigInteger(nb2);
    
    String result = num1.add(num2).toString();
    

    【讨论】:

    • 如果字符串长度为 100 怎么办?
    • 那么我们必须使用BigInteger,但这不是问题中的要求。
    • 好的,来自 OP 的澄清。
    • 谢谢,但我尽量不要使用IntegerBigInteger,只有String 这就是我尝试使用for 循环的原因
    【解决方案6】:

    按如下方式进行:

    public class Main {
        public static void main(String args[]) {
            System.out.println(getSum("270", "270"));
            System.out.println(getSum("3270", "270"));
            System.out.println(getSum("270", "3270"));
        }
    
        static String getSum(String n1, String n2) {
            StringBuilder sb = new StringBuilder();
            int i, n, cf = 0, nl1 = n1.length(), nl2 = n2.length(), max = nl1 > nl2 ? nl1 : nl2, diff = Math.abs(nl1 - nl2);
    
            for (i = max - diff - 1; i >= 0; i--) {
                if (nl1 > nl2) {
                    n = cf + Integer.parseInt(String.valueOf(n1.charAt(i + diff)))
                            + Integer.parseInt(String.valueOf(n2.charAt(i)));
                } else {
                    n = cf + Integer.parseInt(String.valueOf(n1.charAt(i)))
                            + Integer.parseInt(String.valueOf(n2.charAt(i + diff)));
                }
                if (n > 9) {
                    sb.append(n % 10);
                    cf = n / 10;
                } else {
                    sb.append(n);
                    cf = 0;
                }
            }
            if (nl1 > nl2) {
                for (int j = i + 1; j >= 0; j--) {
                    sb.append(n1.charAt(j));
                }
            } else if (nl1 < nl2) {
                for (int j = i + 1; j >= 0; j--) {
                    sb.append(n2.charAt(j));
                }
            }
            return sb.reverse().toString();
        }
    }
    

    输出:

    540
    3540
    3540
    

    【讨论】:

      【解决方案7】:

      我想提出一个更简洁的解决方案,将 2 个 数相加并返回结果。只需保持一个进位,同时添加2位,如果进位大于0,则在最后添加进位。

      public class Main{
          public static void main(String[] args) {
              System.out.println(addTwoNumbers("135","135"));
          }
      
          private static String addTwoNumbers(String s1,String s2){
              if(s1.length() < s2.length()) return addTwoNumbers(s2,s1);
              StringBuilder result = new StringBuilder("");
              int ptr2 = s2.length() - 1,carry = 0;
              for(int i=s1.length()-1;i>=0;--i){
                   int res = s1.charAt(i) - '0' + (ptr2 < 0 ? 0 : s2.charAt(ptr2--) - '0') + carry;
                   result.append(res % 10);
                   carry = res / 10;
              }
      
              if(carry > 0)  result.append(carry);
              return trimLeadingZeroes(result.reverse().toString());
          }
      
          private static String trimLeadingZeroes(String str){
              for(int i=0;i<str.length();++i){
                  if(str.charAt(i) != '0') return str.substring(i); 
              }
      
              return "0";
          }
      }
      

      演示: https://onlinegdb.com/Sketpl-UL

      【讨论】:

        【解决方案8】:

        试试这个,希望对你有用

        Code

        public static int convert_String_To_Number(String numStr,String numStr2) {
                        char ch[] = numStr.toCharArray();
                        char ch2[] = numStr2.toCharArray();
                        int sum1 = 0;
                        int sum=0;
                        //get ascii value for zero
                        int zeroAscii = (int)'0';
                        for (char c:ch) {
                            int tmpAscii = (int)c;
                            sum = (sum*10)+(tmpAscii-zeroAscii);
        
                        }
        for (char d:ch2) {
                            int tmpAscii = (int)d;
                            sum1 = (sum*10)+(tmpAscii-zeroAscii);
        
                        }
        
                        return sum+sum1;
                    }
                    public static void main(String a[]) {
                        System.out.println("\"123 + 123\" == "+convert_String_To_Number("123" , "123"));
        
                    }
                }
        

        【讨论】:

        • sumsum1 在这里会产生相同的结果,你永远不会使用第二个数组。另外,这相当于使用 parseInt,它不考虑 String 何时高于整数限制。
        • 是的。感谢您为我强调这一点。我已经编辑了代码。
        猜你喜欢
        • 2018-07-17
        • 2015-09-18
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        • 2019-02-03
        • 2015-08-20
        • 2015-07-31
        相关资源
        最近更新 更多