【问题标题】:Using a Nested For Loop to "Add" Two String Arrays With Number Values Together使用嵌套的 For 循环将两个带有数字值的字符串数组“相加”在一起
【发布时间】:2019-04-21 20:27:17
【问题描述】:

我正在尝试制作一个程序,该程序采用 x 数量的添加剂并将它们转换为基于字符串的结果。使用 String[ ] 而不是 int[ ] 的原因是因为有些数字对于 int/long 来说太大了(而且我们不允许在这个项目中使用 BigInteger),所以我们在这个项目中坚持使用 String[ ]程序。另外:String[ ] 参数中的所有值都是 25 个零长,用数字替换最后几个零,如下所示。

例如:如果你传入一个包含三个值的字符串数组...

0000000000000000000000203

0000000000000000000000045

0000000000000000000000010

该方法会将其压缩为具有值的 String[ ]...

0000000000000000000000258

困难的部分是解释“结转数字”,就像在初等代数中一样。 以下是我到目前为止所得到的

//Every array will be 25 digits long. Mostly zeroes with the numbers to add at the 
//end
public static final int ARRSIZE = 25;

public static void addStuff(String[] stuff)    {
    String[] result = new String[ARRSIZE];
    int[] holder = new int[ARRSIZE];
    String temp = "";
    int area = 0;
    int carry = 0;
    for (int i = 0; i < stuff.length; i++)
    {
        for (int j = 0; j < stuff.length; j++)
        {
            temp = stuff[j].substring(stuff[i].length() - 1-i, stuff[i].length()-i);
            area += Integer.parseInt(temp);
            if (area >= 10)
            {
                carry = area/10;
                holder[ARRSIZE - 1-i] = area%10;
                area = 0;
            }
            carry = 0;
        }
    }

    //TODO: Make int[] holder -> String[] result
    //Take result String[] to future method
}

我试图用这段代码做的是读取每个 String[ ] 元素的最后一个元素,将其转换为 int 以添加下一行,并将最终数字存储为 String[] (结果)以便以后在以后的方法中打印。我一直对嵌套的 for 循环很不满意,所以我认为这种混乱会发生。到目前为止,我已经设法弄清了我成功添加最右边的列并将其存储在区域中的逻辑,同时携带了一个数字。从那以后,我就迷路了。

【问题讨论】:

  • 当您将两个全为 9 且有进位的 ARRSIZE 数字相加,创建一个 ARRSIZE+1 大小的数字时会发生什么?
  • @ggorlen 您是否建议我使用此代码可能会出现越界异常?我们在作业中给出的最高数字不会超过 25 码,如果这就是你的要求的话。它实际上是 23 或 24 作为给定的最高数字
  • 好的,很方便。还想问一下:你为什么回void?你应该如何改变 String[] stuff 以便返回结果?它是否应该变成一个只有一个元素的字符串数组,多余的空间会发生什么?在这里返回String 对我来说最有意义。
  • @ggorlen 我现在有点不担心这个。我目前的计划是把我在这个方法中得到的东西传递给另一个方法。未来方法要么输出到控制台数学(分配的目标),要么我将其更改为返回到以前的方法

标签: java arrays nested-loops


【解决方案1】:

只是一个简单的解决方案,您可能需要对其进行一些调整以符合您的需求:

public static void addStuff(String[] stuff) {
    if (stuff.length != result.length) {
        throw new IllegalArgumentException("length does not match");
    }
    int carry = 0;
    for (int i = stuff.length - 1; i >= 0; i--) {
        int temp = Integer.parseInt(result[i]) + Integer.parseInt(stuff[i]) + carry;
        carry = temp / 10;
        result[i] = String.valueOf(temp % 10);
    }
}

这会将给定的字符串数组添加到全局结果数组中,定义如下:

private static final String[] result = "0000000000000000000000000".split("");

如果您使用提供的号码调用它,您可以这样使用它:

addStuff("0000000000000000000000203".split(""));
addStuff("0000000000000000000000045".split(""));
addStuff("0000000000000000000000010".split(""));
System.out.println(String.join("", result));

结果将是:

0000000000000000000000258

希望对您有所帮助。当然你应该做更多的异常处理,但这只是一个小例子,向你展示如何解决你的问题。

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 2011-09-02
    • 2011-11-05
    • 1970-01-01
    • 2013-08-07
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多