我是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();
}
}
答案 0 :(得分:1)
简单的答案是你写了一个双循环。
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
......这不是你想要的。如果你将这些数字相乘,那么你可能会做的事情就是这样。但是当你减去它们时,你想要通过 parallel 遍历数组 - 也就是说,同时查看a[0]
和b[0]
,{{1 }}和a[1]
,b[1]
和a[2]
等。为此,您只想使用一个循环和一个索引。 (如果一个阵列比另一个阵列短,你需要小心处理它。)(确保你在10000减去9999上测试程序。)
(P.S。最好避免使用单个字母b[2]
作为变量名。它看起来太像l
了。)
更多:要回答我认为您在评论中提出的问题:对于此问题,1
和a
的索引相同,因为你已经向后存储了数字,而b
和a[0]
中的低位数字(这个问题的一个很好的方法)。如果您遇到类似的问题,您需要并行浏览两个数组但使用不同的索引,则可以在单个b[0]
语句中放置多个索引。假设您有两个可能长度不同的数组,并且您希望向后遍历两个数组并在达到较短数组的开头时停止:
for
每次循环时,它都会递减for (int i = array1.length - 1, j = array2.length - 1;
i >= 0 && j >= 0;
i--, j--) {
// do something with array1[i] and array2[j]
}
和i
。这与双循环非常不同,其中一个j
嵌套在另一个循环中;在double循环中,只有内部索引被更改而外部索引保持不变;然后当使用内部索引完成内部循环时,然后更改外部索引并重新启动内部循环。
答案 1 :(得分:0)
这是我最新编辑的代码。我现在的问题是这样的:
x = 4500; y = 599;
输出为2,应为3。
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;
}
for (int k = 0; k<a.length; k++)
for (int m = 0; m<b.length; m++)
{
c1 = k;
c2 = m;
}
int aa=0;
if (c1>c2)
{
aa = c1;
}
else
{
aa = c2;
}
for (int k = 0; k<aa; k++)
{
if (a[k]<b[k])
{
a[k] = a[k] + 10;
borrow+=1;
}
}
System.out.print ("\nBorrow: " + borrow);
System.out.println();
}
}