我是Java新手。我对此代码有疑问,其中您必须计算借用多少次才能进行减法。
例如:

x = 312;
y = 34;


输出应为:2,因为您已减去2次借来了。
我的问题是这样的,每当我输入x = 12,y = 2时,输出也为1,当x = 12时,y =1。它应该为0。

这是我的代码:

import java.util.Scanner;

public class BorrowOut{
    public static void main (String [] args){

        Scanner in = new Scanner (System.in);
        int x;
        int y;
        int i = 0;
        int j = 0;
        int minus = 0, borrow = 0;
        int c1 = 0, c2 = 0;

        System.out.print("\nx: ");
        x = in.nextInt();

        //this will convert the integer (x) into string and then count its length;
        int len = (Integer.toString(x).length());
        int[] a = new int[len];

        System.out.print("y: ");
        y = in.nextInt();

        minus = x - y;
        System.out.print("\nDifference: " + minus);

        //this will convert the integer (y) into string and then count its length
        int len2 = (Integer.toString(y).length());
        int[] b = new int[len2];

        //splitting the inputs into a single token storing it in an array
        while(x>0 && y>0)
        {
            a[i++] = x % 10;
            x = x/10;
        }
        while(y>0)
        {
            b[j++] = y % 10;
            y = y/10;
        }
        /*System.out.println("\nx");

        //printing out the index and the token
        for (int k = 0; k<a.length; k++)
        {
            System.out.println("a[" + k + "] " + a[k]);
        }
        System.out.println("\ny");
        for (int l = 0; l<b.length; l++)
        {
            System.out.println("b[" + l + "] " + b[l]);
        }*/
        for (int k = 0; k<a.length; k++)
            for (int l = 0; l<b.length; l++)
        {
            c1 = k;
            c2 = l;
            if (a[k]<b[l])
            {
                a[k] = a[k] + 10;
                borrow+=1;
            }

        }
        if (c1!=c2)
        {
                borrow-=1;
        }
        System.out.print ("\nBorrow: " + borrow);
        System.out.println();
    }
}

最佳答案

简单的答案是您已经编写了一个双循环。

for (int k = 0; k<a.length; k++)
    for (int l = 0; l<b.length; l++)
{
    c1 = k;
    c2 = l;
    if (a[k]<b[l])
    {
        a[k] = a[k] + 10;
        borrow+=1;
    }

}


它的作用是:将k设置为0,然后在k为0时,将l用作索引来遍历整个数组b。然后将k增加到1,然后从头开始l遍历整个数组b。然后k变为2,并且再次遍历数组b ...这不是您想要的。如果您将数字相乘,可能会做这种事情。但是,在减去它们时,您希望并行遍历数组-即同时查看a[0]b[0]a[1]b[1]a[2]和等。为此,您只想使用一个循环和一个索引。 (如果一个数组比另一个数组短,那么您将需要谨慎对待它。)(确保在10000减去9999上测试程序。)

(P.S.最好避免将单个字母b[2]作为变量名。它看起来太像l。)

更多:要回答我认为您在评论中提出的问题:对于此问题,1a的索引都相同,因为您已将数字以低位顺序向后存储ba[0]中的数字(解决此问题的一种好方法)。如果您遇到类似的问题,需要并行通过两个数组但索引不同,则可以将多个索引放在单个b[0]语句中。假设您有两个长度可能不同的数组,并且想向后遍历两个数组,并在到达较短的数组的开头时停止:

for (int i = array1.length - 1, j = array2.length - 1;
     i >= 0 && j >= 0;
     i--, j--) {
    // do something with array1[i] and array2[j]
}


每次循环时,它都会减小fori。这与一个j嵌套在另一个循环中的双循环非常不同。在双循环中,仅更改内部索引,而外部索引保持不变;然后,当使用内部索引完成内部循环时,将更改外部索引,并重新开始内部循环。

10-01 19:22