很长的字符串整数求和

有次面试,被人问到这个问题,简单的写了个原理,代码一时没写出来。
得空把这个给完成了,查了下,BigInteger有现成的,又一个轮子。
package info.frady;

public class BigNumber {
	public static int width=1000;
	/**
	 * 两个字符串的大数相加,最大可以到1000位
	 * @param a1
	 * @param a2
	 * @return
	 */
	public static String add(String a1,String a2){
		int num1[],num2[],num3[];
		num1=num2=num3=new int[width];
		//将字符串数字赋值给数组
		num1=toIntArray(a1);
		if(num1[0]==-1){
			return "输入的第一个参数不是数字,请检查";
		}
		num2=toIntArray(a2);
		if(num2[0]==-1){
			return "输入的第二个参数不是数字,请检查";
		}
		
		for(int i=0;i<width-1;i++){
			int temp=0;
			temp=num1[i]+num2[i]+num3[i];
			num1[i]=temp % 10;//num1存结果的余数
			num3[i+1]=(temp/10)%10;//num3存结果的进位
		}
		while(!isZero(num3)){
			for(int i=0;i<width-1;i++){
				int temp=0;
				temp=num1[i]+num3[i];
				num1[i]=temp % 10;//num1存结果的余数
				num3[i+1]=(temp/10)%10;//num3存结果的进位
			}
		}
		
		StringBuffer sb=new StringBuffer();
		boolean flag=false;
		for(int i=num1.length-1;i>=0;i--){
			if(num1[i]!=0){
				flag=true;
			}
			if(flag){
				sb.append(num1[i]);
			}
		}
		return sb.toString();
	}
	
	/**
	 * 字符串转化成数字,如果包含不是数字的字符,就将第一位置为-1,调用程序通过第一位的数值来判断是否出错
	 * @param str
	 * @return
	 */
	public static int[] toIntArray(String a1){
		int num1[]=new int[width];
		for(int i=1;i<=a1.length();i++){
			int temp=0;
			temp=Character.getNumericValue(a1.charAt(a1.length()-i));
			if(temp>=0&&temp<=9){
				
				num1[i-1]=temp;
			}
			else{
				num1[0]=-1;
				return num1;
			}
		}
		return num1;
	}
	
	public static boolean isZero(int num[]){
		boolean flag=true;
		for(int i=0;i<num.length;i++){
			if(num[i]>0){
				return false;
			}
		}
		return flag;
	}
	
	public static void main(String[] args) {
		System.out.println(add("1m1","22"));
		System.out.println(add("19","22"));
		System.out.println(add("33","88"));
		System.out.println(add("99","99"));
		System.out.println(add("0","99"));
		System.out.println(add("100","99"));
		System.out.println(add("102","99"));
		
	}

}

你可能感兴趣的:(面试)