NYOJ513-A+B Problem IV

来源:互联网 发布:广工数据挖掘2016 编辑:程序博客网 时间:2024/04/28 07:06

A+B Problem IV

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
输入
包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)
输出
每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。
样例输入
1.9 0.10.1 0.91.23 2.13 4.0
样例输出
213.337
分析:将两个加数存到整型数组中,并分别记录下各自小数点的位置,然后将小数部分较短的加数进行移位,低位补0,然后相加,输出的时候注意忽略小数点后面多余的0,另外由于长度<400,所以两个加起来(移位之后)就有可能等于800位,刚开始定义410位,贡献啦几个WA。。。
#include<stdio.h>#include<string.h>#define N 1000int num1[N+10],num2[N+10],res[N+10];char s1[N+10],s2[N+10];void move(int *num, int d){    int i;    for(i=N;i>=d&&num[i-d]==0;i--);    for(;i>=d;i--){        num[i]=num[i-d];    }    for(i=d-1;i>=0;i--){        num[i]=0;    }}int main(){    int n,i,j,len1,len2,site1,site2,site,len;    while(scanf("%s %s",s1,s2)!=EOF) {                memset(num1,0,sizeof(num1));        memset(num2,0,sizeof(num2));        memset(res,0,sizeof(res));        len1=strlen(s1);        len2=strlen(s2);        for(i=len1-1,j=site1=0;i>=0;i--) {            if(s1[i]=='.'){                site1=j;                continue;            }            num1[j++]=s1[i]-'0';        }        for(i=len2-1,j=site2=0;i>=0;i--) {            if(s2[i]=='.'){                site2=j;                continue;            }            num2[j++]=s2[i]-'0';        }        if(site1>site2){            move(num2,site1-site2);        }        else if(site1<site2){            move(num1,site2-site1);        }        site=site1>site2?site1:site2;                for(i=0;i<N;i++)  {            res[i]+=num1[i]+num2[i];//注意这里一定是+=,否则进位会丢失掉             if(res[i]>=10) {                res[i]-=10;                res[i+1]+=1;            }        }        for(i=N-1;i>=0&&res[i]==0;i--);        if(i<0) {            printf("0\n");            continue;        }                for(;i>=site;i--){//整数部分             printf("%d",res[i]);        }        if(site>0){//有小数部分             for(i=0,len=-1;i<site;i++){                if(res[i]!=0) {                    len=i;                    break;                }            }            if(len!=-1){                printf(".");                for(i=site-1;i>=len;i--){                    printf("%d",res[i]);                }            }        }        printf("\n");     }    system("pause");    return 0;}

原创粉丝点击