解题思路:
面对高精度的数相乘,我们首先想到的是用数组或者字符串,这里我使用的是 vector容器,因为它有个size函数,比较方便。把数存储到容器中是倒序存储的,当结果大于原来输入的数时,可以直接在后面添加,而不是正序一位一位往后退。算法部分是模拟小学学的乘法,用双层for循环把每个数相乘存储到另一个容器里面,然后进行判断,如果数据还没有处理完,就把每一个没处理完的数据 % 10,然后添加到末尾;如果位数在原来的位数里面,就把原来位数上的数字改为 % 10后的。
步骤:
1、先把传入的字符串倒序存入到各自的容器A B里
2、再把每一个数相乘存储到另一个容器C里
3、对容器C的数据统一处理,如果在循环i在容器C的大小里,就把此时容器对应i的数字改为 % 10(不用在末尾添加),如果循环的i大于等于C的大小,说明数据还没有处理完,需要在容器C末尾添加 % 10的数
题解不易,希望大家支持一下,点个评分;也希望大佬们指导改正!!!
注意事项:
1、数据是倒着存进容器里面的,注意边界问题
2、对数据进行统一时,要考虑数据没有处理完的情况,这时进应该在末尾加上 %10后的结果;反之就需要在原先的位数 %10即可
3、注意要消除前导零(“”001“”)这种情况
参考代码:
#include #include using namespace std; vector mul(vector &A,vector &B) { vector C(A.size() + B.size());//定义容器大小 for(int i = 0;i < A.size();i++)//使用双层for循环,使每一个数与每一个数相乘 { for(int j = 0;j < B.size();j++) { C[i + j] += A[i] * B[j];//存入到容器C } } for(int i = 0,t = 0;i < C.size() || t;i++)//对这些数据进行处理,t表示进位。循环要么是i没有循环完,要么是t != 0 { t += C[i]; if(i >= C.size())//如果数据还没有处理完,就说明结果大于原先的位数,需要添加位数 C.push_back(t % 10); else//反之只需要在原先的位数上处理即可 C[i] = t % 10; t /= 10;//表示进位 } while(C.size() > 1 && C.back() == 0)//消除前导零 { C.pop_back(); } return C; } int main() { string a,b; cin >> a >> b; vector A,B; for(int i = a.size() - 1;i >= 0;i--)//倒序存进容器里面 { A.push_back(a[i] - '0'); } for(int i = b.size() - 1;i >= 0;i--) { B.push_back(b[i] - '0'); } auto C = mul(A,B);//等价于 vector C = mul(A,B) for(int i = C.size() - 1;i >= 0;i--) { cout << C[i]; } cout << endl; return 0; }
附yxc大佬的模板
vector mul(vector &A, vector &B) { vector C(A.size() + B.size()); for (int i = 0; i < A.size(); i ++ ) for (int j = 0; j < B.size(); j ++ ) C[i + j] += A[i] * B[j]; for (int i = 0, t = 0; i < C.size() || t; i ++ ) { t += C[i]; if (i >= C.size()) C.push_back(t % 10); else C[i] = t % 10; t /= 10; } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; }
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复