大数

大数加法:int,long long 的数量级分别为 1e9,1e18,当数据大于18位时无法直接简单的a+b计算,会变成负数。

这里就要用数组来模拟俩个数相加。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; 
char str1[505],str2[505];
int a[505],b[505],c[505];

int main() {
    scanf("%s%s",str1,str2);
    int i,la,lb;
    la = strlen(str1);
    lb = strlen(str2);
    for(i=0;i<la;i++)
    {
        a[la-i] = str1[i] - '0';//字符转化为数字 
    }
    for(i=0;i<lb;i++)
    {
        b[lb-i] = str2[i] - '0';
    }
    int lc = max(la,lb)+1; //可能最后一位进位(如果不进,后面要消去) 
    for(i=1;i<=lc;i++)
    {
        c[i] += a[i] + b[i] ;
        c[i+1] +=c[i]/10;
        c[i] = c[i]%10;
    }
    if(c[lc]==0&&lc>1) lc--;//if c[i] 等同于指向最大位,判断是否为0(要判断是否就是0,所以有lc>0) 
    for(i=0;i<lc;i++)
    {
        printf("%d",c[lc-i]);
    }

    return 0;
}

大数减法
差不多相同的道理,只是变成与更大位数借位,这个一换,就成就了减法;
上代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std; 
int a[505],b[505],c[505];
char st1[505],st2[505],st3[505];

bool compare(char s1[], char s2[])
{
    int x = strlen(s1);
    int y = strlen(s2);
    if(x!=y) return x>y;
    else{
        int i;
        for(i=0;i<x;i++)
        if(s1[i]!=s2[i])
        return s1[i]>s2[i];

    }
}
int main() {
    int flag = 0;
    scanf("%s%s",st1,st2);
    int i,j;
    if(!compare(st1,st2)) 
    {
         flag = 1;
        strcpy(st3,st1);
        strcpy(st1,st2);
        strcpy(st2,st3);
    }
    int x = strlen(st1);
    int y = strlen(st2);
    for(i=0;i<x;i++)
        a[x-i] = st1[i] - '0'; 
    for(i=0;i<y;i++)
        b[y-i] = st2[i] - '0';
    int z = x;

    for(i=1;i<=z;i++)
    {
        if(a[i]<b[i])
        {
            printf("zcx");
            a[i]+=10;
            a[i+1] -=1;

        }
        c[i] = a[i] - b[i];

      }
    while(c[z]==0&& z>1) z--;
    if(flag) printf("-");
    for(i=z;i>0;i--)
    printf("%d",c[i]);

    return 0;
}
全部评论

相关推荐

在努力的外卷侠很靠谱:怎么,大家都没保底吗?我这美团已经入职了,不说了,系统派单了。
点赞 评论 收藏
分享
把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务