Skip to main content

HDOJ 1002 “A + B Problem II” wp

链接:1002,记得输出的Case C要大写,我因为没有大写,一直通不过,一度怀疑自己,难道我连第三题都写不出吗(实际上我第二题就是抄别人的,所以第三题我发誓不看别人的了),oj不像pta告诉你哪里错了,对我这种粗心的人很不友好,好了,言归正传。

先说一下我的思路吧,这道题需要处理无限大数的加法(如果是python就好了),首先就要考虑无限大数怎么存,c语言提供的普通类型当然都不行,最大的double类型好像能到10的308次方,可惜精度不足也不够大,其实无限大的数是可以存在内存里的(只要内存够),在裸机上是可行的,可惜操作系统和c语言限制了我的发挥,其实我第一个想到的方法就是这个,用一个struct,用位字段的方法,在里面放足够多的uint64_t,可惜printf无法打印自创的数据类型。

所以限制我们发挥的实际上是printf,printf只有%s的打印不会限制,于是我们只好把数存在字符数组里面,人为的做加法,处理进位,再用%s打印出来,c语言代码如下

#include <stdio.h>
#include <string.h>
//人工实现加法,m存贮进位值
char *sum2(int a[],int b[],int k,int j){
    static char c[1001];
    static char d[1001];
    int m=0;
    memset(c,0,1001);
    memset(d,0,1001);
    for(;k>=0;k--,j--){
        if(j < 0) {c[k+1] = (a[k] + m)%10 + '0'; m = (a[k]+m)>=10?(a[k]+m)/10:0;}
        else {c[k+1] = (a[k]+b[j]+m)%10+'0';m = (a[k]+b[j]+m)>=10?(a[k]+b[j]+m)/10:0;}
   
    if(m==0){ //这里写的比较差
        int i;
        for(i=0;c[i+1]!='\0';i++)
            d[i] = c[i+1];
        return d;
    }
    else if(m>0){
        c[0] = m+'0';
        return c;}
}}
//传给sum2纯数字,并确定哪个数位数更多简化后续的加法
char *sumbig(char a[],char b[]){
    int i,j;
    int x[1001],z[1001];
    for(i = 0;a[i]!='\0';i++) x[i] = a[i] - '0';
    for(j = 0;b[j]!='\0';j++) z[j] = b[j] - '0';
    if(i >= j) return sum2(x,z,i-1,j-1);
    else return sum2(z,x,j-1,i-1);
}
int main(){
    int n;
    char a[1001],b[1001];
    scanf("%d",&n);
    for(int i = 1;i <= n;i++){
        scanf("%s %s",a,b);
        printf("Case %d:\n",i);
        printf("%s + %s = %s\n\n",a,b,sumbig(a,b));
    }

    return 0;
}