实现如下,上代码:
public class SumStrNumber {
public static void main(String[] args) {
String a="123456789",b="98765432100000000";
//String a="9098",b="100";
System.out.println(bigAdd(a,b));
System.out.println(multiplicationUseAdd(a,b));
System.out.println(multiplicationUseM(a,b));
}
/**
* 两个字符串表示的大数相加,传入字符串必须为纯数字,不带正负号
* @param a
* @param b
* @return sum
*/
public static String bigAdd(String a,String b){
int carry = 0; //记录进位数
StringBuilder sb = new StringBuilder();
for(int i=1; i<=(a.length() > b.length() ? a.length() : b.length()); i++){
int c = (a.length()>=i ? a.charAt(a.length()-i)-'0' : 0) //短的字符串数字高位用0补齐
+ (b.length()>=i ? b.charAt(b.length()-i)-'0' : 0)
+ carry;
sb.append(c%10); //当前位拼接到字符串
carry = c/10; //进位留到下一次运算
}
if(carry>0){
sb.append(carry); //最后一次运算若有进位,拼接到字符串
}
return sb.reverse().toString();
}
/**
* 用已经实现的大数加法来实现大数乘法,将a*b当作a个b相加即可。(经测试,该方法效率非常低)
* @param a
* @param b
* @return sum
*/
public static String multiplicationUseAdd(String a,String b){
String reStr = "0";
//理解为a个b相加即可
for(int i=0;i
int loop = (int) (Math.pow(10, a.length()-1-i) * (a.charAt(i)-'0'));
for(int j=0;j
reStr = bigAdd(reStr,b);
}
}
return reStr;
}
/**
* 将a拆分为每位的单数后与b相乘,结果补齐a的位数的0的个数,与前一次循环的结果求和.
* @param a
* @param b
* @return sum
*/
public static String multiplicationUseM(String a,String b){
String reStr = "0";
int carry = 0; //记录进位数
int loopA=0,loopB=0,loopM=0;
String lowNum = ""; //低位补齐0
StringBuilder sb = new StringBuilder();
for(int i=0;i
sb.append(lowNum);
lowNum += "0";
loopA = a.charAt(a.length()-1-i)-'0';
if(loopA==0){ //a位为0时直接跳过本次循环
continue;
}
for(int j=0;j
loopB = b.charAt(b.length()-1-j)-'0';
loopM = loopA * loopB + carry;
sb.append(loopM%10);
carry = loopM/10;
}
if(carry>0){
sb.append(carry); //最后一次运算若有进位,拼接到字符串
carry = 0; //进位置0,这个比较重要
}
reStr = bigAdd(reStr,sb.reverse().toString()); //累加本次乘积
sb.delete(0, sb.length());
}
return reStr;
}
}