介绍
这篇文章主要介绍c++如何实现大数相乘算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
具体内容如下
首先说一下乘法计算的算法:同样是模拟人工计算时的方法。
从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后一位,再将各项结果相加,得出最后结果。
计算的过程基本上和小学生列竖式做乘法相同。为编程方便,并不急于处理进位,而将进位问题留待最后统一处理。
我们以125 * 53为例来说明计算过程:
1,先算125 * 3 * 5得到15个1,3 * 2得6到10个,3 * 1得100年到3个,下面是存储结果的数组的形式
2,接下来算125 * 5 * 5得10到25个,2 * 5得到10个100,5 * 1得到5个1000;
3,乘法过程完毕。接下来从一个[0]开始向高位逐位处理进位问题。[0]留5下,把1加到一个[1]上,一个[1]变为32后,应留下2,把3加到一个[2]上……最终使得一里的每个元素都是1位数,结果就算出来了
结果就是6625 .
总结一个规律:即一个数的第位我和另一个数的第j位相乘所得的数,一定是要累加到结果的第i + j位上。这里i, j都是从右往左,从0开始数。
即:ans (i + j]=[我]* b [j]。
另外进位时要处理,当前的值加上进位的值再看本位数字是否又有进位;前导清零。
下面是c++代码实现:
# include# include # include , , using namespace 性传播疾病; # define MAX 1010, , , int main () { string std1, std2; ,,cin>的在std1>的在std2; int length2 =, std1.length (); int length3 =, std2.length (); int (MAX),=, {0}; int b (MAX),=, {0}; int 结果[2,*,MAX),=, {0}; int 小姐:=,0,,j =, 0;//将字符串转移到数组中,以方便计算,,注意是倒叙存储//即字符串123存为321,为的是将低位放在前面方便计算, (小姐:=,length2 作用;1,j =, 0;,小姐:祝辞=,0;,我———,j + +) { [j],=, std1[我],安康;& # 39;0 & # 39;; } (小姐:=,length3 作用;1,j =, 0;,小姐:祝辞=,0;,我———,j + +) { b [j],=, std2[我],安康;& # 39;0 & # 39;; }//将结果储存在,resullt中,结果[小姐:+,j],=,一个[我],*,b [j]是关键算法, (小姐:=,0;,小姐:& lt;, length2;,我+ +) { 时间=(j 0;, j & lt;, length3;, j + +) { 结果[小姐:+,j], +=,一个[我],*,b [j]; } } ,//从低位到高位进行进位 , (小姐:=,0;,小姐:& lt;, (length2 + length3);,我+ +) { 如果结果[我],祝辞,9) { 结果(i + 1), +=,结果[我]/10; 结果[我],%=,10;, } }//将前导0全部剔掉,比如我们结果是236年,在结果中//是这样存储的63200年……我们需要定位到第一个不为零的数,它的位置也就是小姐:,两数相乘,位数最多是两数位数之和 , (小姐:=,length2 +, lengrh3;,小姐:祝辞=,0,,,我——) { 如果结果[我],==,0),继续; else 断裂; }//接着我继续输出,就是我们的结果, (,,小姐:在=0;,我——) [我]cout<& lt;结果; return 0; }
以上是“c++如何实现大数相乘算法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!