题目链接:https://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的。
示例1
输入:"11","99"
返回值:"1089"
说明:11*99=1089
示例2
输入:"1","0"
返回值:"0"
要创建并使用数组就要知道数组的长度。
假设输入的两个数都是两位数
假设输入的一个是二位数,一个是三位数
由此可见,当输入的一个为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()];
......
}
那么乘积的结果怎么存储在数组中呢?
将两个数位的乘积除以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<tmp.length;i++){
stringBuilder.append(tmp[i]);
}
return stringBuilder.toString();
}
}