// 按结果的每一位进行计算 std :: string multiplyTwoStrings ( const std :: string & s1 , const std :: string & s2 ) { int len1 = s1 . length ( ) ; int len2 = s2 . length ( ) ; int sum = 0 ; std :: string res ; for ( int k = 0 ; k < len1 + len2 ; ++ k ) { // 最终乘积的结果最大长度为 len1 + len2 ,分别计算每一位 // 第 k 位 应该为 s1 的第 0 位乘以 s2 的第 k - 0 位加上 // s1 的第 1 位乘以 s2 的第 k - 1 位加上 // s1 的第 i 位乘以 s2 的第 k - i 位 ...... for ( int i = 0 ; i <= k ; ++ i ) { if ( i < len1 & k - i < len2 ) { sum + = ( s1 [ len1 - i - 1 ] - '0' ) * ( s2 [ len2 - 1 - k + i ] - '0' ) ; // 上面所得的结果是逆序的,即第 len1 + len2 位为低位(个位),所以在插入字符串时是往前插 res . insert ( 0 , 1 , sum % 10 + '0' ) ; sum / = 10 ; return res [ 0 ] == '0' ? & res [ 1 ] : res ; // 按过程的每一位进行计算 std :: string multiply ( const std :: string & s1 , const std :: string & s2 ) { if ( s1 . empty ( ) || s2 . empty ( ) ) { return "0" ; int lenOfs1 = s1 . length ( ) ; int lenOfs2 = s2 . length ( ) ; // res 用于存储中间的计算值,是最终结果的逆序存储,即数字的高位存在 vector 的前面 std :: vector < int > res ( lenOfs1 + lenOfs2 , 0 ) ; int idxOfs1 = 0 , idxOfs2 = 0 ; // 用于标记 s1 中的哪一位与 s2 中的哪一位乘 for ( int i = lenOfs1 - 1 ; i >= 0 ; -- i ) { int carry = 0 ; int num1 = s1 [ i ] - '0' ; idxOfs2 = 0 ; for ( int j = lenOfs2 - 1 ; j >= 0 ; -- j ) { int num2 = s2 [ j ] - '0' ; int sum = num1 * num2 + carry + res [ idxOfs1 + idxOfs2 ] ; // multiply of two numbers & carry & number pre cacl res [ idxOfs1 + idxOfs2 ] = sum % 10 ; // 对应位的乘积会保存到对应位置 carry = sum / 10 ; idxOfs2 ++ ; if ( carry > 0 ) { res [ idxOfs1 + idxOfs2 ] + = carry ; idxOfs1 ++ ; auto it = std :: find_if ( res . rbegin ( ) , res . rend ( ) , [ ] ( int & x ) { return x != 0 ; } ) ; // 去掉前置 0,即找到逆序数组中后面第一个不为 0 的位置,例如 12 * 34 得到的 vector 为 8040,则 it 指向 4 的位置 std :: string s ; std :: for_each ( it , res . rend ( ) , [ & ] ( int x ) { s + = std :: to_string ( x ) ; } ) ; // 反向将数字插入到字符中 return s ; int main ( ) { std :: string s1 = "12" ; std :: string s2 = "-34" ; bool nflag1 = s1 [ 0 ] == '-' ; bool nflag2 = s2 [ 0 ] == '-' ; std :: string res = ( nflag1 ^ nflag2 ) ? "-" : "" ; // 符号处理,异或用于简便检测结果的正负, res + = multiplyTwoStrings ( nflag1 ? s1 . substr ( 1 ) : s1 , nflag2 ? s2 . substr ( 1 ) : s2 ) ; // 传入字符串时只传入数字部分 std :: cout << "(" << s1 << ") * (" << s2 << ") = " << res << '\n' ; res = ( nflag1 ^ nflag2 ) ? "-" : "" ; res + = multiply ( nflag1 ? s1 . substr ( 1 ) : s1 , nflag2 ? s2 . substr ( 1 ) : s2 ) ; std :: cout << "(" << s1 << ") * (" << s2 << ") = " << res << '\n' ; return 0 ; 本文实例为大家分享了 C++ 实现 大数 相乘的具体代码,供大家参考,具体内容如下首先说一下 乘法 计算的算法:同样是模拟人工计算时的方法。从低位向高位乘,在竖式计算 ,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后一位,再将各项结果相加,得出最后结果。计算的过程基本上和小学生列竖式做 乘法 相同。为编程方便,并不急于处理进位,而将进位问题留待最... 由于 数字 无法用一个整形变量存储,很自然的想到用 字符串 来表示一串 数字 。然后按照 乘法 的运算规则,用一个乘数的每一位乘以另一个乘数,然后将所有 间结果按正确位置相加得到最终结果。可以分析得出如果乘数为A和B,A的位数为m,B的位数为n,则乘积结果为m+n-1位(最高位无进位)或m+n位(最高位有进位)。因此可以分配一个m+n的辅存来存储最终结果。为了节约空间,所有的 间结果直接在m+n的辅存上进行累加。 文章目录一.题目:利用双重循环打印九九 乘法 表二. 实现 思路①外层循环i的规律:从1开始,每加一次1,就会换行1次。i可以从1循环到9,要用循环语句。②内层循环j的规律:从1循环到i ,例如i循环到3的时候,j就循环到3,i循环到4的时候,j就循环到4。③掌握规律之后,逐步分解,从少到多。阶梯式源码④接下来,可以试着加乘号、等号、相乘之后得到的结果,完成从少到多的过程。三.源码 一.题目:利用双重循环打印九九 乘法 表 1X1=1 1X2=2 2X2=4 1X3=3 2X3=6 3X3=9 1X4=4 2X 引言: 有一些很大的 数字 相乘,乘出来的 数字 可能会超过我们所学的任意基本类型的范围,这个时候我们就可以用 字符串 去处理它,把它存放在 字符串 。 1.暴力解决:直接把每一位拿出来乘,乘完再相加。 2.运用 乘法 原理:每一位的 数字 乘出来以后,再在相应的位上相加,最后再进位,将数组输出即可。 不难发现其 的关系,第一个是乘出来的数在数组 的位置等于两个原数组的下标和,第二个是在乘的时候是从... 为什么需要高精度计算 对于 C++ 而言,最大的数据为 long long(64b,8位),对于超过 8B 的数据, C++ 没有对应的数据类型进行表示。所以我们需要知道高精度计算。更详细的解释,可以参考这个网页https://blog.csdn.net/justidle/article/details/104414459。 高精度 乘法 计算原理 在读小学时,我们做 乘法 都采用竖式方法,如图 1 ...