高精度加法和乘法

基本思路:数组从下标为1(当然也可以为0,看个人喜好)开始倒序存储大位数,可以理解成1存放个位,2存放10位,3存放百位,以此类推。进行大数加法时,只需讲下标从1开始,俩个数组相加,满10进1即可。进行大数乘法时,循环嵌套,从第二个数组开始,第1位,到最后一位依次与第一个数组的第一位相乘,然后对第一个数组的第二位依次相乘。

 

为了提高运算速度,避免不必要的运算,我在函数里面加了几个参数,lena,lenb,lenc分别表示数组的有效长度(即存放了几位的数)。

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 1e3 + 100;
int a[maxn];
int b[maxn];
int c[maxn];

void Plus(int *a, int *c, int lena, int lenc)
{
    int jw = 0;
    for(int i = 1; i <= max(lena, lenc) + 10; i++){
        c[i] += a[i] + jw;
        jw = c[i] / 10;
        c[i] %= 10;
    }
}

void Mul(int *a, int b, int lena)
{
    int jw = 0;
    for(int i = 1; i <= lena + 10; i++){
        a[i] *= b;
        a[i] += jw;
        jw = a[i] / 10;
        a[i] %= 10;
    }
}

void Mul(int *a, int *b, int *c, int lena, int lenb)
{
    int jw = 0;
    for(int i = 1; i <= lena + 10; i++){
        jw = 0;
        for(int j = 1; j <= lenb + 10; j++){
            c[i + j - 1] += a[i] * b[j] + jw;
            jw = c[i + j - 1] / 10;
            c[i + j - 1] %= 10;
        }
    }
}

int main()
{
    int lena, lenb;
    int n;

    string s, str;
    cin>>s>>str;
    lena = s.size();
    lenb = str.size();
    for(int i = 0; i < s.size(); i++){
        a[i + 1] = s[s.size() - i - 1] - '0';
    }
    for(int j = 0; j < str.size(); j++){
        b[j + 1] = str[str.size() - j - 1] - '0';
    }
    Plus(a,b,lena,lenb);
    bool flag = true;
    for(int i = 1000; i > 0; i--){
        if(b[i] != 0)flag = false;
        if(!flag)printf("%d", b[i]);
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值