用字符串计算3000多位十进制大数乘法的C++小程序

9 篇文章 0 订阅
4 篇文章 0 订阅

改了一下程序,改用字符串计算3000多位十进制大数乘法的C++小程序

 

// 2020.01.21
// 作者:shencz2000
// 计算两个大数的乘积,version 0.2 。 c++小程序。

#include<iostream>
#include<string>
using namespace std;
const int M=5000;    //第一个数最大位数
const int N=5000;    //第二个数最大位数

int multiply(string& bigNum1, string& bigNum2, string& resultBigN);
int inputCheck(string& bigN1, string& bigN2);
int reverse(string& bigN);
int noNumber(string& bigN);

int main()
{
    int i,len,len1,len2,t;
    string bigN1, bigN2;    //给字符数组增加一位用来放结束字符
    string result;                //给字符数组增加一位用来放结束字符
    cout<<"请输入一个2-"<<M<<"位数的数:" ;
    cin>>bigN1;
    cout<<"请输入一个2-"<<N<<"位数的数:" ;
    cin>>bigN2;
    len1=bigN1.length();
    len2=bigN2.length();
    len=len1+len2;
    cout<<"第一个数是:"<<bigN1<<", 有"<<len1<<"位"<<endl;
    cout<<"第二个数是:"<<bigN2<<", 有"<<len2<<"位"<<endl;
    t=inputCheck(bigN1, bigN2);
    if(t==0)
    {
        for(i=0;i<(len+1);i++)
            result+='0';
        multiply(bigN1, bigN2, result);
        cout <<"乘积结果是:"<<result<<", 有"<<result.length()<<"位"<<endl;
        // system("pause");        //如果在windows下运行该程序,请使该语句有效,即删掉最前面的两个斜杠。
    }
    return 0;
}

int noNumber(string& bigN)
{
    int i;
    for(i=0;i<bigN.length();i++)
    {
        if(bigN[i]<'0' || bigN[i]>'9')
            return 2;
    }
    return 0;
}

int inputCheck(string& bigN1, string& bigN2)
{
    int i;
    int status=0;
    if(bigN1.length()>M || bigN2.length()>N)
    {
        cout<<"某个数位数超范围!"<<endl;
        status=1;
    }
    else if(noNumber(bigN1)|| noNumber(bigN2))
    {
        cout<<"某个数有的数字不在0-9之间。"<<endl;
        status=2;
    }
    return status;
}

int reverse(string&  bigN)
{
    char temp;
    int i,sl;
    sl=bigN.length();
    for(i=0;i<(sl/2-0.5);i++)
    {
        temp=bigN[i];
        bigN[i]=bigN[sl-1-i];
        bigN[sl-1-i]=temp;
    }
    return 0;
}
int multiply(string& bigNum1, string& bigNum2, string& resultBigN)
{
    int i,j,a,b,d,e,f,g,len1,len2;
    len1=bigNum1.length();        //两个字符串里的字符数
    len2=bigNum2.length();
    string tempBigN;        //保存一个len1位数与一位数的乘积
    for(i=0;i<(len1+1);i++)
        tempBigN+='0';
    reverse(bigNum1);        //反转bigNum1和bigNum2
    reverse(bigNum2);
    for(i=0;i<len2;i++)        //计算中间值
    {
        a=bigNum2[i]-'0';
        e=0;                //给两个个位数的乘积的的高位赋初值0    
        for(j=0;j<len1;j++)
        {
            b=bigNum1[j]-'0';
            d=b*a+e;
            e=d/10;
            f=d%10;
            tempBigN[j]=f+'0';
        }
        tempBigN[j]=e+'0';
        tempBigN[++j]='\0';

        /*cout<<"第"<<i<<"次tempBigN的值:";        //显示tempBigN[i]的值
        for(j=0;j<len1+1;j++)
            cout<<tempBigNlen1-j];
        cout<<endl;    */
        
        g=0;                //设置进位的初始值为0
        for(j=0;j<(len1+1);j++)    
        {    
            a=resultBigN[j+i]-'0';
            b=tempBigN[j]-'0';
            d=a+b+g;
            g=d/10;
            f=d%10;
            resultBigN[j+i]=f+'0';
        }
    }
    reverse(resultBigN);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值