我试图写一个算法,其中添加两个数字存储为字符在两个数组。不幸的是,它不起作用。当我试图调试它时,我看到变量a和b得到的值是-1,这毫无意义。知道是什么问题吗?
public class rechner2 {
public static void main(String[] args) {
final char[] zahl1 = {1, 2, 3};
final char[] zahl2 = {7, 8, 9};
//Add arrays zahl1 and zahl2.
char [] zwischenarray = add(zahl1, zahl2);
for (int i = 0; i < zwischenarray.length; i++) {
System.out.println(zwischenarray[i]);
}
}
private static char[] add(char[] zahl1, char[] zahl2) {
int len;
if (zahl1.length < zahl2.length) {
len = zahl2.length;
} else {
len = zahl1.length;
}
char[] finalresult = new char [len + 1];
int carryover = 0;
for (int i = 0; i < len; i++) {
int a = Character.getNumericValue(zahl1[i]);
int b = Character.getNumericValue(zahl2[i]);
int c = a + b + carryover;
if (c > 9) {
carryover = 1;
c = c - 10;
} else {
carryover = 0;
}
finalresult[i] = (char)c;
}
if (carryover == 1) {
finalresult[len + 1] = 1;
}
return finalresult;
}
}
在这段代码中我认为有2个bug
- 代替char,我想int 更好。
- 数组长度
代码如下:公共类rechner2 {
public static void main(String[] args) {
int[] zahl1 = {1,2,3};
int[] zahl2 = {7,8,9};
//Add arrays zahl1 and zahl2.
int [] zwischenarray = add(zahl1, zahl2);
for (int i = 0; i < zwischenarray.length; i++) {
System.out.println(zwischenarray[i]);
}
}
private static int[] add(int[] zahl1, int[] zahl2) {
int len;
if (zahl1.length < zahl2.length) {
len = zahl2.length;
} else {
len = zahl1.length;
}
int[] finalresult = new int [len + 1];
int carryover = 0;
for (int i = 0; i <= len-1; i++) {
int a = (zahl1[i]);
int b = (zahl2[i]);
int c = a + b + carryover;
if (c > 9) {
carryover = 1;
c = c - 10;
} else {
carryover = 0;
}
finalresult[i] = c;
}
if (carryover == 1) {
finalresult[len] = 1;
}
return finalresult;
}
}
你的代码有冲突:数组中的数字/字符实际上是整数,而不是"printable"或者"human readable";字符。但是,部分代码将它们视为"可打印的"。
让我们回到几十年前,并使用ASCII作为这个解释的开头。ASCII有"Printable"one_answers";Nonprintable"字符。"Nonprintable"字符被称为"控制码"。
控制代码包括移动显示终端上的光标或打印终端上的打印头的代码。它们包括CR(回车)、LF(换行)、HT(水平制表符)和BS(退格)。其它的被数据通信硬件用来控制数据流,或者报告状态。
可打印字符对应于您在终端屏幕或打印输出中看到的内容。它们包括大写字母、小写字母、数字、标点符号和空格字符。它们是"人类可读的"。
查看维基百科文章中可打印字符的列表。以5
为例。它被表示为以10为基数的"53",对应于以16为基数的"35",或者以二进制表示的"011 0101"。请注意,它与二进制数5不同,后者将是'0000 0101'。
Java的char
类型使用16位Unicode,而不是ASCII。Java编译器允许对char
数据进行算术运算,就好像它与short
相同。
代码中的这些行期望您的char
变量和常量是可打印的字符:
int a = Character.getNumericValue(zahl1[i]);
int b = Character.getNumericValue(zahl2[i]);
另外,将zwischenarray
指定为char
告诉编译器将这一行中的内容作为可打印字符处理:
System.out.println(zwischenarray[i]);
但是,其余的代码将char
数据视为整数数据类型。
这一行有一个错误:finalresult[len + 1] = 1;
。在修复了这个bug之后,如何修复剩下的代码?有不同的方法,哪一种最好取决于你的意图。
为了演示,请尝试这样做:替换以下
int a = Character.getNumericValue(zahl1[i]);
int b = Character.getNumericValue(zahl2[i]);
int c = a + b + carryover;
int c = zahl1[i] + zahl2 [i] + carryover;
另外,在输出行中进行强制转换:
System.out.println((short)zwischenarray[i]);
然后运行它。这将演示您可以对Javachar
数据进行算术运算。
现在,删除输出行中的(short)
强制转换,并将所有出现的char
更改为short
(或int
)。您的程序仍然可以运行。
这是因为您输入zahl1
和zahl2
的值的方式。您的源代码由可打印字符和空白组成。通过省略单引号,您告诉编译器将值转换为二进制整数。例如,源代码9
在运行时代码中变成了二进制0000 1001
。如果您希望您的9
保持为可打印字符,您需要将其括在单引号中:'9'
.
通过将zahl1
和zahl2
中的所有值用单引号括起来,Character.getNumericValue
的使用是合适的。但是,您仍然需要在System.out中使用(short)
或(int)
强制转换。行查看输出。
Character.getNumericValue
返回-1
,因为传递的值超出了它的设计工作范围。
有两种方法可以将十进制二进制整数转换为等效的可打印字符:
finalresult[i] = (char) (c + '0');
但是,我更喜欢这个:
final String digit = "0123456789";
finalresult[i] = digit.charAt (c);