很长的字符串整数求和

有次面试,被人问到这个问题,简单的写了个原理,代码一时没写出来。
得空把这个给完成了,查了下,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"));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值