大数相加相乘

Posted shoulinniao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数相加相乘相关的知识,希望对你有一定的参考价值。

用乘法行列式多次相乘多次相加,时间复杂度为O(nm),n,m分别为两个数字长度。

#include<stdio.h>
#include<iostream>
#include<string>
#include<sstream>
using namespace std;

string a,b,ans,zero,product;///输入a,b,ans是最终答案,zero是乘法行列式补零用的,product暂时存储单位数乘积
int len1,len2,cha,maxx;
int s,r;///s是本位,r是进位

string add(string a,string b)///字符串大数相加
{
    string res="";
    s=0;r=0;
    len1=a.size();
    len2=b.size();

    if(len1>=len2)
    {
        cha=len1-len2;
        for(int i=0;i<cha;i++)
            b="0"+b;
    }
    else
    {
        cha=len2-len1;
        for(int i=0;i<cha;i++)
            a="0"+a;
    }
    maxx=max(len1,len2);
    for(int i=maxx-1;i>=0;i--)
    {
        s=(a[i]-0+b[i]-0+r)%10;///先加上上次的进位
        r=(a[i]-0+b[i]-0+r)/10;///本次进不进位,进位则是1,不进位则是0
        res=(char)(s+0)+res;
    }
    if(r)
        res="1"+res;    ///最左边需不需要进位
    return res;
}

string trans(int a)  ///整型转化为string型,需要头文件sstream
{
    stringstream ss;///中转站
    string res;
    ss<<a;
    ss>>res;
    return res;
}

string multiplication(string a,char b)///字符串数字*单个字符
{
    s=r=0;
    string res="";
    int x,y=b-0;
    int len=a.size();
    for(int i=len-1;i>=0;i--)
    {
        x=a[i]-0;
        s=(x*y+r)%10;
        r=(x*y+r)/10;
        res=(char)(s+0)+res;
    }
    if(r)
        res=char(r+0)+res;
    return res;
}

int main()
{
    int t;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        cin>>a>>b;
        ans="";
        zero="";
        len2=b.size();
        for(int j=len2-1;j>=0;j--)
        {
            product=multiplication(a,b[j])+zero;
            ans=add(ans,product);
            zero=zero+0;  ///每往左进一位,乘法多补一个0
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

以上是关于大数相加相乘的主要内容,如果未能解决你的问题,请参考以下文章

js大数相加和大数相乘

大数相加相乘

求解Catalan数,(大数相乘,大数相除,大数相加)

java 很长的大数 如何用String 相加,相乘?

SOJ 1002/1003/1004 大整数相加/相乘/相除

leetcode 43 大数相乘