Java程序练习-长整数加法运算

长整数加法运算
时间限制: 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(",");
		List<Integer>list1 = new ArrayList<Integer>();
		List<Integer>list2 = new ArrayList<Integer>();
		List<Integer>list_temp = new ArrayList<Integer>();
		List<Integer>list3 = new ArrayList<Integer>();
		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 <s1a.length;++ 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<Integer> 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 查看评论
posted @ 2011-10-03 21:19  技术就是力量  阅读(991)  评论(0)    收藏  举报