使用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).