力库-优化的模拟乘法-字符串相乘

字符串相乘成功测试

采用一个ans数组来存放每列相加的结果,但先不进位,最后一起进位;因为两数相乘,位数最多为两数位数相加,因此数组的长度定义为:

int s1 = x.length; int s2 = y.length;
        int []ans = new int[s1+s2]; 

然后相乘

        for(int i = 0 ; i < s1 ; i ++){
            for(int j = 0; j < s2 ; j ++){
                ans[i+j]+=(x[i]-'0')*(y[j]-'0');
            }
        }

整体程序如下:

import java.util.Scanner;

/**
 * 实现两个字符串相乘
 * 字符串长度<110
 * 输出为字符串长度
 * */
public class BigInterger {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String a = scanner.nextLine();
        String b = scanner.nextLine();
        if(a.length()>110||b.length()>110){
            System.out.println("false");
        }
        String output = new BigInterger().amp(a,b);
        System.out.println(output);
    }

    public String amp(String a, String b){
        /*int start1 = 0,start2 = 0;  // 第一个踩坑点,要防止开始数据020/060,这些数据
        if(!('1'<=a.charAt(0)&&a.charAt(0)<='9')){
            start1 = a.indexOf('0')+1; // 第二个踩坑点,start的起始位置要注意
        }
        if(!('1'<=a.charAt(0)&&a.charAt(0)<='9')){
            start2 = b.indexOf('0')+1;
        }*/
        StringBuffer aa = new StringBuffer(a);
        StringBuffer bb = new StringBuffer(b);
        char [] x = aa.reverse().toString().toCharArray();
        char [] y = bb.reverse().toString().toCharArray();
        //System.out.println(x);
        String output = "";
        int s1 = x.length; int s2 = y.length;
        int []ans = new int[s1+s2];
        for(int i = 0 ; i < s1 ; i ++){
            for(int j = 0; j < s2 ; j ++){
                ans[i+j]+=(x[i]-'0')*(y[j]-'0');
            }
        }
        for(int i = 0; i < s1+s2 - 1; i ++){
            //System.out.println(ans[i]);
            if(ans[i]>9) {
                ans[i + 1] = (ans[i + 1] + ans[i] / 10);
                ans[i]=ans[i]%10;
            }
            //System.out.println(ans[i]);
        }
        int pos = ans[s1+s2 - 1]== 0 ?   s1 + s2 - 2 :   s1 + s2 - 1; // 第三个踩坑点,最高位为0就不要输出了
        boolean flag = true;  //用标记位来判断最高位不为零的输出
        for(int i = pos  ; i >= 0 ; i --) {
            //System.out.println(ans[pos]);
            if(flag&&ans[i]==0){
                continue;
            }
            flag = false;
            output += (char)(ans[i] + '0');
            //System.out.println((char)ans[pos]);
        }
        return output;
    }
}

运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值