1 条题解
-
0
题意分析
题目要求输入两个不超过40位的正整数,计算它们的乘积,并以没有前导零的常规数字形式输出。由于数字位数较大,不能直接使用基本数据类型进行计算,需要采用高精度计算的方法,手动模拟乘法运算过程。
解题思路
1.输入两个正整数,以字符串形式存储。
2.将字符串形式的数字倒序存储到数组中,方便从低位到高位进行计算。
3.模拟乘法运算,通过两层循环,将两个数的每一位相乘,并考虑进位。
4.处理乘积结果中的进位,得到最终的结果数组。
5.去掉结果数组中的前导零。
6.倒序输出结果数组,得到最终的乘积。
分析
1.由于数字位数较大,使用字符串存储数字,然后转换为数组进行计算。
2.模拟乘法运算时,按照乘法的计算规则,将一个数的每一位与另一个数的每一位相乘,再加上进位,得到对应位置的结果。
3.计算过程中,需要处理进位,确保结果的准确性。
4.最后,需要去掉结果数组中的前导零,以满足题目输出要求。
实现步骤
1.定义字符数组 str1 和 str2 用于存储输入的两个数字字符串,定义整数数组 t1、t2 和 a 用于存储转换后的数字和计算结果。
2.用 cin 读取输入的两个数字字符串,计算字符串长度 len1 和 len2。
3.将字符串 str1 和 str2 中的字符转换为数字,并倒序存储到数组 t1 和 t2 中。
4.进行乘法运算,通过两层 for 循环,计算 t1 和 t2 中每一位数字的乘积,并加上进位,将结果存储到数组 a 中。
5.处理数组 a 中的进位,确保每一位数字都在0到9之间。
6.计算结果数组 a 的有效长度 lena,去掉前导零。
7.倒序输出数组 a 中有效的数字,得到最终的乘积。
代码实现
#include<iostream> #include<cstring> using namespace std; char str1[100], str2[100]; int t1[100], t2[100], a[200]; // Increased array size for product int main() { cin >> str1 >> str2; int len1 = strlen(str1); int len2 = strlen(str2); // Reverse store (starting from index 1) for (int i = 0; i < len1; i++) { t1[len1 - i] = str1[i] - '0'; } for (int i = 0; i < len2; i++) { t2[len2 - i] = str2[i] - '0'; } // Multiply for (int i = 1; i <= len1; i++) { int carry = 0; for (int j = 1; j <= len2; j++) { a[i + j - 1] += carry + t1[i] * t2[j]; carry = a[i + j - 1] / 10; a[i + j - 1] %= 10; } a[i + len2] = carry; } // Calculate result length int lena = len1 + len2; while (a[lena] == 0 && lena > 1) lena--; // Output result for (int i = lena; i >= 1; i--) { cout << a[i]; } cout << endl; return 0; }
代码说明
#include<iostream> #include<string.h> using namespace std; //大整数乘法 char str1[100],str2[100]; int t1[100],t2[100],a[100]; int main(){ cin>>str1>>str2; // 读取两个数字字符串 int len1=strlen(str1); // 计算第一个字符串长度 int len2=strlen(str2); // 计算第二个字符串长度 //倒序保存 //从1开始 for(int i=0;i<len1;i++){ t1[len1-i]=str1[i]-'0'; // 将第一个字符串字符转换为数字并倒序存储 } for(int i=0;i<len2;i++){ t2[len2-i]=str2[i]-'0'; // 将第二个字符串字符转换为数字并倒序存储 } for(int i=1;i<=len1;i++){ int x=0; // 进位 for(int j=1;j<=len2;j++){ a[i+j-1]+=x+t1[i]*t2[j]; // 计算乘积并加上进位,累加到对应位置 x=a[i+j-1]/10; // 计算进位 a[i+j-1]=a[i+j-1]%10; // 保留个位数字 } a[i+len2]=x; // 处理最后一位的进位 } //乘法位数相加 int lena=len1+len2; //去掉前导0 存的时候在后面 while(a[lena]==0 && lena>1) lena--; // 去掉前导零,更新有效长度 for(int i=lena;i>=1;i--){ cout<<a[i]; // 倒序输出结果 } cout<<endl; return 0; }
代码中,首先读取输入的两个数字字符串,然后将其转换为倒序存储的数字数组。通过两层循环模拟乘法运算,计算每一位的乘积并处理进位。最后,去掉结果数组中的前导零,倒序输出结果数组,得到最终的乘积。
- 1
信息
- ID
- 1390
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 17
- 已通过
- 1
- 上传者