用字符数组计算10000多位十进制大数乘积的C++小程序

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

       最近想计算一下10000多位十进制大数的乘积,没有找到合适的程序,因此自己编了一个C++小程序。如下所示。

试了以下,可以使用。该程序使用了字符数组。

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

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

int multiply(char bigNum1[], char bigNum2[], char resultBigN[]);
int inputCheck(char bigN1[], char bigN2[]);
int reverse(char bigN[]);
int noAllN(char bigN[]);
int input(char bigN[]);

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

int input(char bigN[])
{
    int i,len,j=M/4095,pos=0;
    char temp[4096],select[5];
    cout<<"请输入一个2-"<<M<<"位数的数,前高位后低位。"<<endl;
    cout<<"输入者将大于4095位的的数按4095位分段,分多段输入。"<<endl ;
    cout<<"每次输入4095位并且次数少于3次,才能再次输入:"<<endl;
    do
    {
        select[0]='n';
        cin>>temp;
        len=strlen(temp);
        for(i=0;i<len;i++)
            bigN[i+pos]=temp[i];
        pos+=len;
        j--;
        if(len==4095&&j>0)
        {
            cout<<"你还要输入吗(请输入y或者n)? :"<<endl;
            cin>> select;
        }
        if(select[0]=='y')
            cout<<"请输入1-4095位数:"<<endl;
    }
    while(select[0]=='y');
    bigN[pos]='\0';
    return 0;
}

int noAllN(char bigN[])
{
    int i;
    for(i=0;i<strlen(bigN);i++)
    {
        if(bigN[i]<'0' || bigN[i]>'9')
            return 2;
    }
    return 0;
}

int inputCheck(char bigN1[], char bigN2[])
{
    int i, len,len1,len2;
    int status=0;
    len1=strlen(bigN1);
    len2=strlen(bigN2);
    if(len1>(M+1) |len2>(N+1))
    {
        cout<<"输入的两个数位数超范围!"<<endl;
        status=1;
    }
    else if((status=noAllN(bigN1))||(status=noAllN(bigN2)))
        cout<<"某个数有的数字不在0-9之间。"<<endl;
    return status;
}

int reverse(char bigN[])
{
    char temp;
    int i,sl;
    sl=strlen(bigN);
    for(i=0;i<(sl-1)/2;i++)
    {
        temp=bigN[i];
        bigN[i]=bigN[sl-1-i];
        bigN[sl-1-i]=temp;
    }
    return 0;
}
int multiply(char bigNum1[], char bigNum2[], char resultBigN[])
{
    char tempBigN[M+1+1];    //保存中间计算值的变量。
    int i,j;
    int a,b,d,e,f;
    int len1,len2;            //两个字符数组里的字符数
    len1=strlen(bigNum1);
    len2=strlen(bigNum2);
    reverse(bigNum1);        //反转bigNum1和bigNum2
    reverse(bigNum2);
    for(i=0;i<(len1+len2);i++)    //给resultBigN变量赋初值    
        resultBigN[i]='0';
    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';

        /* cout<<"tempBigN["<<i<<"]的值:";        //倒序显示tempBigN[i]的值
        for(j=0;j<(len1+1);j++)
            cout<<tempBigN[i][len1-j];
        cout<<endl; */

        e=0;                //设置进位的初始值为0
        for(j=0;j<(len1+1);j++)    
        {    
            a=resultBigN[j+i]-'0';
            b=tempBigN[j]-'0';
            d=a+b+e;
            e=d/10;
            f=d%10;
            resultBigN[j+i]=f+'0';
        }
    }
    resultBigN[len1+len2]='\0';            //在有效字符的最后面加一个字符串结束符
    reverse(resultBigN);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值