AOJ437 高精度加法

来源:互联网 发布:软件的质量标准 编辑:程序博客网 时间:2024/06/06 12:21

 

Description
计算一组连续的非负整数的和

 

Input
第一行T,表示测试数据有T组
第2至K+1行:每行一个非负整数,位数在100以内,每组长整数不超过50个,每组输入以"0"结束

 

Output
每组对应一个输出,为该组数的和

 

Sample Input
11234567890123456789012345678901234567890123456789012345678901234567890123456789012345678900

 
Sample Output
370370367037037036703703703670
 
Hint
整数可能以0开始
 
思路:
高精度加法就是模拟手算,用字符串逆序储存数字,每位相加,>=10进一位和下一位相加,要注意这题可能以0开始,即010+010 000+010等都有可能,注意处理前导0
 
参考代码:
 
#include <stdio.h>#include <string.h>char a[55][110]={0};void add(char *a,char *b);//高精度加法void change(char *a);//字符串倒序void del(char *a,int n);//删除前导0int main(){    int t,k=0,i,len,flag,m;    scanf("%d",&t);    while(t--)    {        k=0;                while(scanf("%s",a[k]))        {            flag=0;            m=strlen(a[k]);            if(a[k][0]=='0'&&m==1)                break;            if(a[k][0]=='0')            {                for(i=0;i<m;i++)                {                    if(a[k][i]=='0')                        flag++;                    if(a[k][i]!='0')                        break;                }                del(a[k],flag);            }            change(a[k]);            k++;        }        for(i=0;i<k;i++)            add(a[i],a[i+1]);        len=strlen(a[i]);        for(k=len-1;k>=0;k--)            printf("%c",a[i][k]);        printf("\n");    }    return 0;}void add(char *a,char *b){    int lena,lenb,i,num,e=0;    char p[110]={0};    lena=strlen(a);    lenb=strlen(b);    if(lena>lenb)    {        for(i=0;i<lenb;i++)        {            num=a[i]-'0'+b[i]-'0'+e;            e=num/10;            p[i]=num%10+'0';        }        for(;i<lena;i++)        {            num=a[i]-'0'+e;            e=num/10;            p[i]=num%10+'0';        }        if(e)            p[i++]=e+'0';        p[i]=0;    }    else    {        for(i=0;i<lena;i++)        {            num=a[i]-'0'+b[i]-'0'+e;            e=num/10;            p[i]=num%10+'0';        }        for(;i<lenb;i++)        {            num=b[i]-'0'+e;            e=num/10;            p[i]=num%10+'0';        }        if(e)            p[i++]=e+'0';        p[i]=0;    }    strcpy(b,p);}void change(char *a){    int i,len;    char temp;    len=strlen(a);    for(i=0;i<len/2;i++)    {        temp=a[i];        a[i]=a[len-1-i];        a[len-1-i]=temp;    }}void del(char *a,int n){    int i,len;    len=strlen(a);    for(i=0;i<len-n;i++)        a[i]=a[i+n];    a[i]='\0';}
0 0
原创粉丝点击