使用Java实现任意长数字相加
思路:模拟加法的进位操作,从后遍历两个数组,设置用于两个当前数组位置的标志位。为了这样遍历,需要使用较长的那个字符串,作为for循环的最大值。当两个数字长度一致时,可能进位也可能不进位,要分情况讨论。
下面是实现代码:
@Test
public void bigAddTest(){
bigAdd("9906796769679798703423235246363654754876441124214230999787689","111887023830573298752738651237");
}
/**
* 一个较长的数字加一个较短的数字
* @param s1
* @param s2
*/
private void bigAdd(String s1,String s2){
if((!checkIsNumStr(s1))||(!checkIsNumStr(s2))){
System.out.println("数字格式不正确");
return;
}
String temStr=s1;
if(s1.length()<s2.length()){//交换两个字符串位置,让s1为最长的那个
s1=s2;
s2=temStr;
}
StringBuilder sb=new StringBuilder();
int len1=s1.length()-1;
int len2=s2.length()-1;
int extraAdd=0;//记录进位
for(int i=len1;i>=-1;i--){//从后向前遍历,遍历到最长字符串的前一位,保证在有进位时可以进位
int num1=0;
if(i>-1){
num1=s1.charAt(i)-0x30;//如果不是最后一位,则读取索引位置的数字
}
int num2=0;
if(i-(len1-len2)>=0){
num2=s2.charAt(i-(len1-len2))-0x30;//如果不是说s2的最后一位,则读取索引位置的数字
}
int tmpSum=num1+num2+extraAdd;//计算本次的和
if(i==-1){
if(tmpSum!=0){//如果最后有进位,那就加上
sb.append(tmpSum);
}
break;
}
extraAdd=tmpSum/10;//计算进位大小
sb.append(tmpSum%10);//计算余数,也就是本位制的数字,然后把数字append到StringBuilder()
}
System.out.println(sb.reverse().toString());//最后需要把数字逆序一下
}
/**
* 检查是不是数字
* @param str
* @return
*/
private boolean checkIsNumStr(String str){
if(str==null||str.length()==0){
return false;
}else if(str.length()>1&&str.charAt(0)=='0'){
return false;
}else {
char strArray[]=str.toCharArray();
for(char c:strArray){
if(!((c>='0')&&(c<='9'))){
return false;
}
}
}
return true;
}
算法复杂度为O(N).