如何计算大数的乘法

1.学会使用大数的乘法:思路

        将一连串大数转化成字符串:

string a,b;
    cout<<"超大数运算"<<endl<<"请输入两个大数:";
    cin>>a>>b;
    const char* p1=a.c_str();//格式转换
    const char* p2=b.c_str();

        循环利用字符串进行各位相加并解决进位的问题:

大致思路

1.初始化

        获取两个字符数组的长度

        分配空间

        将储存结果的数组置空

2.开始计算

        开始一位一位的乘法

        进行进位问题

3.打印

        获取结果数组的长度

        cout输出

void big_multiply(const char* a, const char* b)
{
    int sizea, sizeb;
    //获取数组a,b的长度大小
    sizea = strlen(a);  
    sizeb = strlen(b);
    //为放结果的变量分配空间
    int* result = (int*)malloc(sizeof(int) * (sizea + sizeb));
    
    for (int i = 0; i < sizea + sizeb; i++)
        result[i] = 0;
    //开始一位一位的乘法 模拟乘法算出结果resul的每一位
    for (int i = 0; i < sizea; i++)
        for (int j = 0; j < sizeb; j++)
        {
            //某个位的数字
            result[i + j + 1] += (a[i] - '0') * (b[j] - '0');//空一位出来为后面的进位提供空间
        }
    //解决进位问题
    for (int i = sizea + sizeb - 1; i >= 0; i--)//这里需要对result数组进行倒序的处理
    {
        if (result[i] > 9)
        {
            result[i - 1] += result[i] / 10;//先把该进位的提出
            result[i] = result[i] % 10;//得到余数
        }
    }

    int i = 0;
    while (result[i] == 0) i++;//当前面有为0的位时就计数,得到前面0的个数,后面就从第一个不是0的位输出
    for (int j = i; j < sizea + sizeb; j++)
        cout << result[j];
}

2.调用大数的乘法函数

3.整体代码


#include <iostream>
#include <string.h>
using namespace std;
 
void big_multiply(const char *a,const char *b)
{
    int sizea,sizeb;
    sizea=strlen(a);
    sizeb=strlen(b);
 
    int *result=(int *)malloc(sizeof(int)*(sizea+sizeb));
 
    for(int i=0;i<sizea+sizeb;i++)
        result[i]=0;
 
    for(int i=0;i<sizea;i++)
        for(int j=0;j<sizeb;j++)
        {
            result[i+j+1]+=(a[i]-'0')*(b[j]-'0');//空一位出来为后面的进位提供空间
        }
 
    for(int i=sizea+sizeb-1;i>=0;i--)//这里需要对result数组进行倒序的处理
    {
        if(result[i]>9)
        {
            result[i-1]+=result[i]/10;//先把该进位的提出
            result[i]=result[i]%10;//得到余数
        }
    }
    int i=0;
    while(result[i]==0) i++;//当前面有为0的位时就计数,得到前面0的个数,后面就从第一个不是0的位输出
    for(int j=i;j<sizea+sizeb;j++)
        cout<<result[j];
}
 
int main()
{
    string a,b;
    cout<<"超大数运算"<<endl<<"请输入两个大数:";
    cin>>a>>b;
    const char* p1=a.c_str();//格式转换
    const char* p2=b.c_str();
    big_multiply(p1,p2);
    return 0;
}

                                

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值