java 字符串 相乘_Java字符串的大数加法和乘法实现

实现如下,上代码:

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值