简单高精度算法

简单高精度乘法

涉及到较大数字的乘法,往往不能简单地使用int ,或者long long来解决,高精度乘法就是来模拟我们自己做乘法运算。
下面,以 789x89 =70,221 为例,解释简单高精度乘法的算法。
本文是博主作为C++初学者的第一篇博客,有感而写,其中有不严谨之处还望多多指教~
7 8 9
x 8 9
72 81
64 72 (用一个二维数组存)
56 63
——————— (每一列求和)
56 127 144 81 【1】(再进位)
7 0 2 2 1 【2】

下面是高精度乘法代码,已经过Dev C++ 调试

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
using namespace std ;
int sum[200][200] ;
int main()
{
    string s1 , s2 ;    //用字符串来存两个乘数
    cin >> s1 >> s2 ;
    memset( sum , 0 , sizeof(sum)) ; //初始化为0 
    int res[250]= {0} ;   //存最终结果
    int len1 = s1.size() , len2 = s2.size();
    reverse( s1.begin() ,s1.end() ) ;  //翻转两个字符串
    reverse( s2.begin() ,s2.end() ) ;
    int i , j ;
    int k = len1+len2-2 ;    // 【1】状态的位数
    for( i=0 ; i<len1; i++)
    {
        for( j=0; j<=k; j++)
        {
            if( j<len2+i)  
                sum[i][j+i] = ( s1[i]-'0') * ( s2[j]-'0') ; //模拟手算,填充二维维数组
            else
                sum[i][j] = 0 ;   // 其余补空为0
        }
    }
    //列求和
    for( int u=0; u<=k ; u++)   //列数 
    {
        for(int v=0; v<len1 ; v++) //行数
        {
            res[u] += sum[v][u] ;           
        } 
    }
    //进位
    for(int u=0; u<=k; u++)
    {
        res[u+1] += res[u]/10 ;
        res[u] %= 10 ;
        if( res[k+1]!=0 )
        {
            k++ ;
        }               
    }   
     //逆序输出
    for( int u=k; u>=0; u-- )
    {
        cout <<res[u] ;
    } 
    cout <<endl ;
} 

程序调试截图:

程序调试截图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值