专栏首页饶文津的专栏高精度(正整数的加、减、乘法)

高精度(正整数的加、减、乘法)

#include<iostream>
#include<cstring>
using namespace std;
struct bignum
{
    int len;
    int num[505];
    bignum()
    {
        memset(num,0,sizeof(num));
    }
} a,b,c;
int cmp(bignum a,bignum b)
{
    if(a.len>b.len)return 1;
    if(a.len<b.len)return 0;
    for(int i=1; i<=a.len; i++)
    {
        if(a.num[i]>b.num[i])return 1;
    }
    return 0;
}
bignum bigMinus(bignum a,bignum b)
{
    bignum c;
    int clen=a.len;
    for(int i=1; i<=a.len; i++)
    {
        c.num[i]=a.num[i]-b.num[i];
        if(c.num[i]<0)
        {
            c.num[i]+=10;
            a.num[i+1]--;
        }
    }
    while(c.num[clen]==0)clen--;
    c.len=clen;
    return c;
}
bignum bigAdd(bignum a,bignum b)
{
    bignum c;
    int clen=a.len;
    for(int i=1; i<=a.len+1; i++)
    {
        c.num[i]=a.num[i]+b.num[i];
        if(c.num[i]>=10)
        {
            c.num[i]-=10;
            a.num[i+1]++;
        }

    }
    if(c.num[clen+1])clen++;
    c.len=clen;
    return c;
}
bignum bigMultiply(bignum a,bignum b)
{
    bignum c;
    int clen=a.len+b.len-1;
    for(int i=1; i<=a.len; i++)
        for(int j=1; j<=b.len; j++)
        {
            c.num[i+j-1]+=a.num[i]*b.num[j];
            if(c.num[i+j-1]>=10)
            {
                c.num[i+j]+=c.num[i+j-1]/10;
                c.num[i+j-1]%=10;
            }
        }
    if(c.num[clen+1])clen++;
    c.len=clen;
    return c;
}

调用:

int main()
{
    string num1,num2;
    cin>>num1>>num2;
    a.len=num1.length();
    b.len=num2.length();
    for(int i=0; i<a.len; i++)
    {
        a.num[a.len-i]=num1[i]-'0';
    }
    for(int i=0; i<b.len; i++)
    {
        b.num[b.len-i]=num2[i]-'0';
    }
    if(cmp(a,b))
    {
        c=bigAdd(a,b);
    }
    else
    {
        c=bigAdd(b,a);
    }

//    if(cmp(a,b)){
//        c=bigMinus(a,b)
//    }else{
//        printf("-");
//        c=bigMinus(b,a);
//    }

//    c=bigMultiply(a,b);
    for(int i=c.len; i>0; i--)
    {
        cout<<c.num[i];
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【HDU-6148】 Valley Numer(数位dp)

    dfs(当前数位的位置len,这位的数num,是否在上升up,是否有限制limit) limit不用存到状态里,因为limit为true时不可能访问两次。 ...

    饶文津
  • 【POJ 1035】Spell checker

      每个单词,如果字典里存在,输出”该单词 is correct“;如果字典里不存在,但是可以通过删除、添加、替换一个字母得到字典里存在的单词,那就输出 “该单...

    饶文津
  • 【USACO 1.5】Prime Palindromes

    饶文津
  • 大数进制转换

    一般的数字进制转换大家都很熟悉,先转换为十进制数字,再进行 除 n 取余,这种情况适用于操作数不大的情况(不大于最大的基本数据类型(long long)),但是...

    指点
  • 一次分区大表索引整改的案例分析(下)

    确定成功收集统计信息后,发现还是没有效果,在当时操作过程中认为收集统计信息后,oracle没有走上正确的索引就是成本优化器判断错误,于是决定手工绑定走错索引的s...

    IT大咖说
  • PAT 甲级 1001 A+B Format

    1001. A+B Format (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程...

    ShenduCC
  • HBUOJ 回音排版

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • 1006. 换个格式输出整数

    让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS...

    指点
  • 7-6 部分排序 (15 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • Python花式编程案例集锦(6)

    问题描述:输出“水仙花数”。所谓水仙花数是指1个3位的十进制数,其各位数字的立方和等于该数本身。例如:153是水仙花数,因为153 = 1^3 + 5^3 + ...

    Python小屋屋主

扫码关注云+社区

领取腾讯云代金券