长整数加法运算时间限制: 2000ms内存限制: 2000kB
描述问题描述:设计一个实现任意长的整数进行加法运算的演示程序。
基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的范围是 -(2^15 - 1)~(2^15 - 1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
输入-9999,9999(输入第一个加数)
1,0000,0000,0000(输入第二个加数)
输出9999,0000,0001(输出结果,如果前面有多余的0应该去掉)
样例输入-9999,9999 1,0000,0000,0000
样例输出9999,0000,0001
参考代码
//import java.io.BufferedReader;
import java.io.IOException;
//import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
//BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
Scanner cin = new Scanner(System.in);
while(cin.hasNext()){
//String s1 = cin.readLine();
//String s2 = cin.readLine();
String s1 = cin.next();
String s2 = cin.next();
boolean minus_1 = false;
boolean minus_2 = false;
if(s1.contains("-"))
minus_1 = true;
if(s2.contains("-"))
minus_2 = true;
if(minus_1 && !minus_2){
calculate(s1,s2,'-',1);
}else if(!minus_1 && minus_2){
calculate(s2,s1,'-',1);
}else if(minus_1 && minus_2){
calculate(s1,s2,'+',2);
}else{
calculate(s1,s2,'+',3);
}
}
}
private static void calculate(String s1, String s2, char c, int kind) {
String s1a[] = s1.split(",");
String s2a[] = s2.split(",");
Listlist1 = new ArrayList();
Listlist2 = new ArrayList();
Listlist_temp = new ArrayList();
Listlist3 = new ArrayList();
boolean flag = false;
switch(kind){
case 1:
s1a[0] = String.valueOf(0 - Integer.parseInt(s1a[0]));
break;
case 2:
s1a[0] = String.valueOf(0 - Integer.parseInt(s1a[0]));
s2a[0] = String.valueOf(0 - Integer.parseInt(s2a[0]));
break;
case 3:
break;
}
int k = 0;
boolean pout = false;
for(int i = 0;i
int n = Integer.parseInt(s1a[i]);
if(n > 0 || pout){
pout = true;
list_temp.add((n + k) % 10000);
}
k = n / 10000;
}
for(int i = list_temp.size() - 1;i >= 0;-- i){
list1.add(list_temp.get(i));
}
k = 0;
pout = false;
list_temp.clear();
for(int i = 0;i < s2a.length;++ i){
int n = Integer.parseInt(s2a[i]);
if(n > 0 || pout){
list_temp.add((n + k) % 10000);
pout = true;
}
k = n / 10000;
}
for(int i = list_temp.size() - 1;i >= 0;-- i){
list2.add(list_temp.get(i));
}
Iterator it1,it2;
if(list1.size() == 0){
list1.add(0);
}
if(list2.size() == 0){
list2.add(0);
}
int n = 0;
//System.out.println(list1);
//System.out.println(list2);
switch(c){
case '-':
if(list1.size() < list2.size()){
list_temp = list1;
list1 = list2;
list2 = list_temp;
flag = true;
}else if(list1.size() == list2.size()){
for(int i = list1.size() - 1;i >= 0;-- i){
if(list1.get(i) > list2.get(i)){
flag = true;
break;
}
}
if(!flag){
list_temp = list1;
list1 = list2;
list2 = list_temp;
flag = true;
}else{
flag = false;
}
}
n = 0;
int j = 0;
int m = 0;
it1 = list1.iterator();
it2 = list2.iterator();
//System.out.println(list1);
//System.out.println(list2);
while(it1.hasNext()||it2.hasNext()){
if(it1.hasNext()){
n = it1.next() + m;
j ++;
}
if(it2.hasNext()){
int temp = it2.next();
if(n >= temp){
n -= temp;
m = 0;
}else{
n = n + 10000 - temp;
m = -1;
}
}
if(n < 0){
n += 10000;
m = -1;
}
if(n != 0 || j != list1.size())
list3.add(n);
}
break;
case '+':
n = 0;
it1 = list1.iterator();
it2 = list2.iterator();
while(it1.hasNext()||it2.hasNext()){
if(it1.hasNext()){
n += it1.next();
}
if(it2.hasNext()){
n += it2.next();
}
list3.add(n % 10000);
n /= 10000;
}
if(n != 0){
list3.add(n);
}
break;
default:
break;
}
int p = 0;
//System.out.println(list3);
if(list3.size() == 0){
list3.add(0);
}
for(int i = list3.size() - 1;i >= 0;-- i)
if(list3.get(i) != 0){
p = i;
break;
}
n = list3.get(p);
switch(kind){
case 1:
//System.out.println(flag);
if(!flag){
System.out.printf("%d",-n);
}else{
System.out.printf("%d",n);
}
break;
case 2:
System.out.print("-");
System.out.printf("%d",list3.get(p));
break;
case 3:
System.out.printf("%d",list3.get(p));
break;
}
for(int i = p - 1;i >= 0;-- i)
System.out.printf(" %04d",list3.get(i));
System.out.println();
}
}
作者:binfeihan 发表于2011-10-3 21:18:35 原文链接
阅读:108 评论:0 查看评论