大乘数法 -Java

题目链接:icon-default.png?t=N7T8https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId=196&tqId=37177&rp=1&ru=/exam/company&qru=/exam/company&sourceUrl=%2Fexam%2Fcompany&difficulty=undefined&judgeStatus=undefined&tags=&title=

描述

        以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。数据范围: 读入的数字大小满足 0≤n≤10的10^{1000}

示例1

输入:"11","99"

返回值:"1089"

说明:11*99=1089

示例2

输入:"1","0"

返回值:"0"

大乘数法 -Java_第1张图片

        要创建并使用数组就要知道数组的长度

        假设输入的两个数都是两位数

大乘数法 -Java_第2张图片

        假设输入的一个是二位数,一个是三位数

大乘数法 -Java_第3张图片

        由此可见,当输入的一个为n位数,一个为m位数,则结果最小为n+m-1位数,最大为n+m位数,当输入两个整数时,只要知道他们都是几位数,就可定义一个数组,只是结果到底是n+m位还是n+m-1位不确定,就以最大值位数即n+m来决定数组长度

        由题知输入的数为字符串,就可以使用库函数来求数字的位数 ,进而定义一个数组。

public  String Multiplied(String num1,String num2){
        //存储每次计算的结果
        int[] tmp=new int[num1.length()+num2.length()];
        ......
}

        那么乘积的结果怎么存储在数组中呢?

大乘数法 -Java_第4张图片

        将两个数位的乘积除以10的余数放在本位,将两位数的乘积对10取余放在前一位,本位对应的数组下标为i+j-1,其中i的初始值为num1.length-1,j的初始值为num2.length-1。

        代码实现:

public  String Multiplied(String num1,String num2){
        //如果两个字符串任意一个有0,乘积为0
        if(num1.equals("0")||num2.equals("0")){
            return "0";
        }
        //存储计算的结果
        int[] tmp=new int[num1.length()+num2.length()];
        //获取两个数字字符串对应位下标
        int len1=num1.length()-1;
        int len2=num2.length()-1;
        for(int i=len1;i>=0;i--){
            int num1s=num1.charAt(i)-'0';
            for(int j=len2;j>=0;j++){
                int num2s=num2.charAt(j)-'0';
                //tmp[i+j+1]表示当前位的数值
                int sum=tmp[i+j+1]+num1s*num2s;
                tmp[i+j+1]=sum%10;
                //tmp[i+j]表示前一位(进位)要存的值
                tmp[i+j]=sum/10;
            }
        }
        //tmp数组是从最后一个元素开始存数据,首元素可能为0
        int start = 0;
        if(tmp[0]==0)
            start=1;
        //将数据以字符串的形式返回
        StringBuilder stringBuilder=new StringBuilder();
        for(int i=start;i

你可能感兴趣的:(java,算法)