题目描述
给出两个非负整数,求它们的乘积。
输入格式
输入共两行,每行一个非负整数。
输出格式
输出一个非负整数表示乘积。
输入输出样例
输入 #1
1 2
输出 #1
2
说明/提示
每个非负整数不超过 两千位
题目分析:
1.输入:
像高精度求和,输入需要字符串数组,在此原因不在赘述,看我的这个文章https://blog.csdn.net/weixin_72010379/article/details/130136012?spm=1001.2014.3001.5501
2.进行计算操作:
就像小学的列竖式一样,不过利用数组解决问题就得变一变:
创建一个数组,将求和直接存储在一个数组里面,利用两个嵌套的循环就可以了,有个细节:每一次数字求和都是错开一位的,所以注意新创建的数组的下标应该如何规定,内部循环每完成一次,就往后一位开始求和,也就是ver[i+j-1+=num1[i]*num[j];
3.检查:
半段ver数组里面每一个元素,有没有大有9的,如果有就进位:
4.最后的输出:
由于乘法的位数可能在lenMax到lenMax+lenMin之间,所以不能像高精度求和一样,直接分两种情况,ifelse,而是遍历,直到把多余的零去除,利用while,一直遍历直到i>1
代码:
#include <stdio.h>
#include <string.h>
//具体思想:将一个数字用字符串数组录入,直接判断出它的位数
int num1[10010],num2[10010],num[10010],ver[10010];
char arr1[10010],arr2[10010];
int main() {
scanf("%s",arr1);
scanf("%s",arr2);
int len1=strlen(arr1);
int len2=strlen(arr2);
for(int i=0,t=len1; i<len1; i++,t--) {//将每一项进行转化
num1[t]=arr1[i]-48;
}
for(int i=0,t=len2; i<len2; i++,t--) {
num2[t]=arr2[i]-48;
}
//进行操作:
for(int i=1 ; i<=len1; i++) {
for(int j=1; j<=len2; j++) {
ver[j+i-1]+=num1[i]*num2[j];
}
}
for(int i=0; i<len1+len2; i++) {
if(ver[i]>9) {
ver[i+1]+=ver[i]/10;
ver[i]%=10;
}
}
//只需要模拟一个数乘以一个个位数,然后进行多次求
//将零去除掉
int len=len1+len2;
while(ver[len]==0&&len>1) {
len--;
}
for(int i=len; i>=1; i--) {
printf("%d",ver[i]);
}
return 0;
}