急急急.......高精度减法出错java.lang.ArrayIndexOutOfBoundsException

scauxie 2008-04-21 03:54:19


package cn.sub2.sub2;

import java.util.Scanner;

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

{
final int add1Max = 1000;// 可计算最长位数
final int add2Max = 1000;

int i, ka, kb;

char[] a2 = new char[add1Max];
char[] b2 = new char[add1Max];
String a1;
String b1;

Scanner in = new Scanner(System.in);
a1 = in.nextLine();// 输入高精度数;
b1 = in.nextLine();
ka = a1.length();// 获取长度;
kb = b1.length();
for (i = 0; i < a1.length(); i++)
a2[i] = a1.charAt(i);// 将输入的高精度数,存入字符数组中;
for (i = 0; i < b1.length(); i++)
b2[i] = b1.charAt(i);

int[] a = new int[ka];
int[] b = new int[kb];
for (i = 0; i < ka; i++)
a[i] = a2[ka - i - 1] - '0';// 将字符数组中的元素变为整数存入整形数组;

for (i = 0; i < kb; i++)
b[i] = b2[kb - i - 1] - '0';

int m = 0;
for (i = a.length - 1; i >= 0; i--) {
// 进行减法运算;
m = a[i] - b[i];
if (m < 0) {
// 如果被减数的这一位小于减数;
a[i] = m + 10;// 因为减得的是负数,所以加上10;
a[i - 1] -= 1;// 再从前一位减一;
} else
a[i] = m;

}
for (i = ka - 1; i >= 0; i--)
System.out.printf("%d", a[i]);

}
}

...全文
140 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
scauxie 2008-04-22
  • 打赏
  • 举报
回复
咦?可以了,谢谢!!!
我是风 2008-04-22
  • 打赏
  • 举报
回复
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a = in.nextLine();
String b = in.nextLine();
Sub2 sub2 = new Sub2(a, b);
System.out.println(sub2.toString());
}

没错阿
scauxie 2008-04-21
  • 打赏
  • 举报
回复
那要怎么改正哦,可不可以教一下?7楼的代码没有注释,有些地方看不明。我把里面的main()改成

public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//Sub2 sub2 = new Sub2("1000325123512351515", "1223512532523512352151533335234325312513");
String a=new String();
String b=new String();
a=in.nextLine();
b=in.nextLine();
Sub2 sub2 = new Sub2(a,b);
System.out.println(sub2.toString());
}

得到的结果不正确,疑惑ing...
richard_2010 2008-04-21
  • 打赏
  • 举报
回复
错误信息是下标访问越界的意思,哪里越界了,见上面的提示
我是风 2008-04-21
  • 打赏
  • 举报
回复
给你个例子:
public class Sub2 {
private String value;

public Sub2(String minuend, String subtrahend) {
this.subtract(minuend, subtrahend);
}

public String toString() {
return this.value;
}

private boolean subtractIntStr(String minuend, String subtrahend, boolean isAppendZreo, boolean isBorrowed) {
int loops = Math.max(minuend.length(), subtrahend.length());
if(isAppendZreo) {
for(int i = minuend.length(); i < loops; i++) {
minuend += "0";
}
for(int i = subtrahend.length(); i < loops; i++) {
subtrahend += "0";
}
} else {
for(int i = minuend.length(); i < loops; i++) {
minuend = "0" + minuend;
}
for(int i = subtrahend.length(); i < loops; i++) {
subtrahend = "0" + subtrahend;
}
}
int minuendBit;
int subtrahendBit;
for(int i = loops - 1; i >= 0; i--) {
minuendBit = minuend.charAt(i) - 48;
if(isBorrowed) {
minuendBit--;
isBorrowed = false;
}
subtrahendBit = subtrahend.charAt(i) - 48;
if(minuendBit < subtrahendBit) {
minuendBit += 10;
isBorrowed = true;
}
this.value = Integer.toString(minuendBit - subtrahendBit) + this.value;
}

return isBorrowed;
}

private void subtract(String minuend, String subtrahend) {
int index = minuend.indexOf('.');
String minuendInteger = minuend;
String minuendFract = "";
if(index >= 0 && index < minuend.length()) {
minuendInteger = minuend.substring(0, index);
minuendFract = minuend.substring(index + 1);
}
index = subtrahend.indexOf('.');
String subtrahendInteger = subtrahend;
String subtrahendFract = "";
if(index >= 0 && index < subtrahend.length()) {
subtrahendInteger = subtrahend.substring(0, index);
subtrahendFract = subtrahend.substring(index + 1);
}
this.value = "";
boolean isBorrowed = this.subtractIntStr(minuendFract, subtrahendFract, true, false);
this.value = "." + this.value;
isBorrowed = this.subtractIntStr(minuendInteger, subtrahendInteger, false, isBorrowed);

while(this.value.length() > 1) {
if(this.value.charAt(0) == '0') {
if(this.value.charAt(1) == '.') {
break;
}
this.value = this.value.substring(1);
} else {
break;
}
}

if(isBorrowed) {
String newMinuend = "1";
index = this.value.indexOf('.');
if(!(index >= 0 && index < this.value.length())) {
index = this.value.length();
}
for(int i = 0; i < index; i++) {
newMinuend += "0";
}

String newSubtrahend = new String(this.value);
this.value = "";
this.subtract(newMinuend, newSubtrahend);
this.value = "-" + this.value;
}
int lastIndex = this.value.length() - 1;
if(this.value.charAt(lastIndex) == '.') {
this.value = this.value.substring(0, lastIndex);
}
}

public static void main(String[] args) {
Sub2 sub2 = new Sub2("10.00", "1234567890123456789012345678901234567890.123456789");
System.out.println(sub2.toString());
}
}
For_suzhen 2008-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 powerlee2008 的回复:]
for (i = a.length - 1; i >= 0; i--)
a[i - 1] -= 1;// 再从前一位减一;
数组越界
[/Quote]
正解
kunlunningxue 2008-04-21
  • 打赏
  • 举报
回复
java.lang.ArrayIndexOutOfBoundsException
你的数组越界了!
anqini 2008-04-21
  • 打赏
  • 举报
回复
a[i - 1] -= 1;// 再从前一位减一;
这里越位了,当i为0的时候成了a[-1]1=1;
Inhibitory 2008-04-21
  • 打赏
  • 举报
回复
仔细理解编译器给出的错误信息的内容, 就是下标访问越界, 这种在数组中很常见, 要学会从编译器给出的错误信息去找到问题所在之处.
li_d_s 2008-04-21
  • 打赏
  • 举报
回复
说了多少遍了,错误信息。。。。
我是风 2008-04-21
  • 打赏
  • 举报
回复
for (i = a.length - 1; i >= 0; i--)
a[i - 1] -= 1;// 再从前一位减一;
数组越界

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧