两个以字符数组形式存储的数字相加



我试图写一个算法,其中添加两个数字存储为字符在两个数组。不幸的是,它不起作用。当我试图调试它时,我看到变量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

  1. 代替char,我想int
  2. 更好。
  3. 数组长度

代码如下:公共类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)。您的程序仍然可以运行。

这是因为您输入zahl1zahl2的值的方式。您的源代码由可打印字符和空白组成。通过省略单引号,您告诉编译器将值转换为二进制整数。例如,源代码9在运行时代码中变成了二进制0000 1001。如果您希望您的9保持为可打印字符,您需要将其括在单引号中:'9'.

通过将zahl1zahl2中的所有值用单引号括起来,Character.getNumericValue的使用是合适的。但是,您仍然需要在System.out中使用(short)(int)强制转换。行查看输出。

Character.getNumericValue返回-1,因为传递的值超出了它的设计工作范围。

有两种方法可以将十进制二进制整数转换为等效的可打印字符:

finalresult[i] = (char)  (c + '0');

但是,我更喜欢这个:

final String digit = "0123456789";
finalresult[i] = digit.charAt (c);

相关内容

  • 没有找到相关文章

最新更新