java - 我的大整数计算器没有按计划工作,任何 Java 开发人员都可以帮助我吗?
问题描述
我正在为我的 comp sci 课程制作一个大整数计算器,但是我加在一起的一些东西不起作用。基本上据我所知,它只适用于 100 及以下的数字(也可能是 999 及以下)。具体来说,我正在苦苦挣扎的是,当添加 934 + 168 时,它总是得到 10102,而不是 1102。我之前已经把它加起来了,但是在尝试解决其他问题的过程中它不再起作用了。如果有人能够通过告诉我哪里可能出错来帮助我修复我的代码,请这样做。谢谢!
public static void main(String[] args) {
System.out.println("Please enter a positive integer.");
LinkedList a = takeData();
System.out.println("Please enter another positive integer.");
LinkedList b = takeData();
LinkedList<Integer> sum = add(a, b);
//System.out.println("They add to equal:\t");
print(sum);
}
public static LinkedList<Integer> add(LinkedList<Integer> a, LinkedList<Integer> b) {
LinkedList<Integer> sum = new LinkedList<Integer>();
int decide = 0, s = 0;
;
if (a.size() == b.size())
decide = 1;
fillWithZeros(a, b, sum);
print(a);
print(b);
if (decide == 1)
s = a.size() + 1;
else
s = a.size();
int add = 0, count = 0;
for (int x = 0; x < s; x++) {
count = 0;
add = 0;
if (x != s && decide == 0 || decide == 1 && x != s - 1)
add = a.pollLast() + b.pollLast();
if (sum.size() != 0)
add += sum.getFirst();
if (add >= 10) {
add -= 10;
//if(sum.size()>0)
//add+=sum.get(0);
sum.addFirst(0);
sum.addFirst(1);
count++;
//if(sum.size()>=2) THIS DOES NOTHING
//add+= sum.get(1);
}
System.out.println("\nThe " + x + " digit equals = " + add);
System.out.println("x = " + x + "\nsum.size = " + sum.size());
/* if(sum.size()>s-1 && decide==1)
{
System.out.println("YOu stopperd here");
return sum;
}*/
if (x != 0) {
if (sum.size() >= x) {
add += sum.get(1);
if (add >= 10) {
add -= 10;
sum.addFirst(0);
sum.addFirst(1);
if (sum.size() >= 2)
add += sum.get(1);
//add-=10;
//sum.addFirst(1);
sum.set(1, add);
} else {
sum.set(1, add);
}
System.out.println(add);
//sum.set(0,add);
//}
//sum.add(x-1,add);
//sum.add(add);
} else {
//add+= sum.get(x-1);
if (count == 0)
sum.set(0, add);
else
sum.set(1, add);
}
} else
sum.addLast(add);
print(sum);
if (sum.size() > s - 1 && decide == 1)
return sum;
}
return sum;
}
public static void print(LinkedList<Integer> a) {
System.out.println("\nSize of LinkList:\t" + a.size());
for (int x = 1; x <= a.size(); x++)
System.out.print(a.get(x - 1));
}
public static void fillWithZeros(LinkedList<Integer> a, LinkedList<Integer> b, LinkedList<Integer> c) {
while (b.size() != a.size()/*||c.size()!=b.size()*/) {
if (a.size() > b.size())
b.addFirst(0);
else if (a.size() < b.size())
a.addFirst(0);
/*else
c.addFirst(0);*/
}
/*c.addFirst(0);*/
}
public static LinkedList<Integer> takeData() {
boolean correctData = true;
Scanner read = new Scanner(System.in);
LinkedList list = new LinkedList();
do {
if (correctData == false)
System.out.println("Please re-enter a correct integer.");
String n = read.nextLine();
for (int x = 0; x < n.length(); x++) {
if (Character.isDigit(n.charAt(x))) {
int valueOf = n.charAt(x) - 48;
list.add(valueOf);
} else {
correctData = false;
break;
}
correctData = true;
}
} while (correctData == false);
return list;
}
解决方案
您应该以与在纸上相同的方式添加数字,即从最后一位数字开始,添加它们,并在需要时保留 1。
要使用 遍历列表Iterator
,您可能已经知道可以这样做:
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
int digit = iter.next();
// use digit here
}
AListIterator
可以做同样的事情,但它也可以向后迭代:
ListIterator<Integer> iter = list.listIterator(list.size()); // start at end
while (iter.hasPrevious()) {
int digit = iter.previous(); // iterate backwards
// use digit here
}
该类LinkedList
也非常适合向后构建结果,因为除了 之外add()
,它还具有addLast()
(做同样的事情)以及addFirst()
,我们可以使用它们来构建从最后一位数字开始的结果。
了解所有这些之后就变得非常简单,如下所示:
public static LinkedList<Integer> add(LinkedList<Integer> a, LinkedList<Integer> b) {
LinkedList<Integer> sum = new LinkedList<>();
int carry = 0;
ListIterator<Integer> aIter = a.listIterator(a.size());
ListIterator<Integer> bIter = b.listIterator(b.size());
while (carry != 0 || aIter.hasPrevious() || bIter.hasPrevious()) {
int digitSum = carry;
if (aIter.hasPrevious())
digitSum += aIter.previous();
if (bIter.hasPrevious())
digitSum += bIter.previous();
if (digitSum <= 9) {
carry = 0;
} else {
carry = 1;
digitSum -= 10;
}
sum.addFirst(digitSum);
}
return sum;
}
推荐阅读
- android - 处理对 SearchView 图标的点击
- spring - 我在压力测试下遇到了 websocket (PlayFramework) 的问题
- javascript - 使用现有值更新字段
- javascript - 将外部脚本添加到 React 并创建新实例
- python - 从另一个 Python 进程调用 OS 的 Python 可执行文件
- c# - WPF - 使用 C# 从 WPF 中的 Mysql 数据库中检索(选择或下载)图像
- jquery - 无法使用引导程序 4 和角度 6 根据条件显示模态
- python - 变量范围(带线程)
- java - 试图从firebase获取密钥,而不是获得一条奇怪的路径
- lua - 如何反编译这个 Lua 字节码?