两大数相加(十进制)

略微实现了一下,模拟手工相加过程,经过修改应该可以适应其它进制相加算法。

package com.icanfly.test.add;

import java.util.Arrays;
import java.util.BitSet;
import java.util.List;

public class TestMain {
	
	private static List<Character> NUM = Arrays.asList('0','1','2','3','4','5','6','7','8','9'); 

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		System.out.println(add("1374632843268463823472394732947329473924732988473294873294837294732947329479327493274473892479382473289749382748938246","2"));

	}
	
	
	//模拟大数相加
	//因为两个一位数相加最多只能进1位,所以可以使用bitset来标识哪一位是被进了过
	//因为两个大数相加有可能在手动相加时较小的一个一高位计算完毕后使用‘0’作填充
	public static String add(String num1,String num2){
		if(isValid(num1) && isValid(num2)){
			char[] ca1 = new StringBuilder(num1).reverse().toString().toCharArray();
			char[] ca2 = new StringBuilder(num2).reverse().toString().toCharArray();
			//进制位
			int maxFlagLen = ca1.length > ca2.length ? ca1.length : ca2.length;
			BitSet bs = new BitSet(maxFlagLen+1);
			//有可能最后的结果有进位,所以长度要加1
			char[] result = new char[maxFlagLen+1];
			
			for(int i=0;i<maxFlagLen;++i){
				//执行两个相加,带进位
				innerAdd(ca1,ca2,i,bs,result);
			}
			
			//最后检查最高位进位
			boolean add = bs.get(maxFlagLen);
			if(add){
				result[maxFlagLen] = '1';
				return new StringBuilder(new String(result)).reverse().toString();
			}else{
				return new StringBuilder(new String(result,0,result.length-1)).reverse().toString();
			}
		}
		
		throw new RuntimeException("输入不合法");
	}
	
	private static void innerAdd(char[] ca1, char[] ca2, int i,BitSet bs,char[] result) {
		char charA = (ca1.length <=i ? '0' : ca1[i]);
		char charB = (ca2.length <=i ? '0' : ca2[i]);
		byte bA = Byte.valueOf(charA+"");
		byte bB = Byte.valueOf(charB+"");
		byte res = (byte) (bA + bB);
		//如果有进位,则+1
		if(bs.get(i)){
			res++;
		}
		char[] charArr= Byte.toString(res).toCharArray();
		//如果有进位,则标识位设置为true
		if(charArr.length >=2){
			bs.set(i+1);
			result[i] = charArr[1];
		}else{
			result[i] = charArr[0];
		}
	}
	
	public static boolean isValid(String str){
		if(str == null || str.trim().equals("")){
			return false;
		}
		int len = str.length();
		for(int i=0;i<len;++i){
			if(!NUM.contains(str.charAt(i))){
				return false;
			}
		}
		return true;
	}

}
 

你可能感兴趣的:(java,大数相加)