我是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
。)更多:要回答我认为您在评论中提出的问题:对于此问题,
1
和a
的索引都相同,因为您已将数字以低位顺序向后存储b
和a[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]
}
每次循环时,它都会减小
for
和i
。这与一个j
嵌套在另一个循环中的双循环非常不同。在双循环中,仅更改内部索引,而外部索引保持不变;然后,当使用内部索引完成内部循环时,将更改外部索引,并重新开始内部循环。