hdu 1753 大数相加(高精度)

来源:互联网 发布:java final变量 编辑:程序博客网 时间:2024/05/15 07:15
C - 大明A+B
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。 

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。 

Input

本题目包含多组测试数据,请处理到文件结束。 
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

Output

请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。 

Sample Input

1.1 2.91.1111111111 2.34443233431 1.1

Sample Output

43.4555434454

2.1

思路:这个题我是将两个数的小数部分和整数部分分开相加然后在输出的,但是此题有几个需要注意地方:1.小数点后多余的0不能输出,2.第一位小数的进位是要加在整数部分上的(这个比较容易被忽略)我对小数进位的处理方法是:小数部分的第一位从数组的1开始存,然后进位存在下标为0的数组里,不管有没有进位直接将a[0]直接加到 整数部分的第一位这样比较方便处理ac 代码:#include<stdio.h>#include<string.h>int a[510],b[510],c[510],d[510];char s1[510],s2[510];int main(){    int  i,j,n1,n2,t1,t2,num1,num2,k;     while(scanf("%s%s",s1,s2)!=EOF)     {      t1=n1=strlen(s1);            t2=n2=strlen(s2);        memset(a,0,sizeof(a));          memset(b,0,sizeof(b));          memset(c,0,sizeof(c));          memset(d,0,sizeof(d));              for(i=0;i<n1;i++)             {  if(s1[i]=='.')                 { t1=i;                  break; } } k=0;  for(i=t1-1;i>=0;i--)   a[k++]=s1[i]-'0'; for(i=0;i<n2;i++)     if(s2[i]=='.')   {t2=i;     break;  }   k=0;  for(i=t2-1;i>=0;i--)   b[k++]=s2[i]-'0';   k=1;   if(t1+1<n1)      for(i=t1+1;i<n1;i++)        c[k++]=s1[i]-'0';   k=1;    if(t2+1<n2)       for(i=t2+1;i<n2;i++)       d[k++]=s2[i]-'0';    num1=(n1-t1)>(n2-t2)?(n1-t1):(n2-t2);    for(i=num1;i>=1;i--)     {  c[i]+=d[i];       if(c[i]>=10)        {   c[i-1]++;            c[i]-=10;} } a[0]+=c[0]; num2=(t1-1)>(t2-1)?(t1-1):(t2-1); for(i=0;i<=num2;i++) {   a[i]+=b[i];    if(a[i]>=10)    {  a[i+1]++;      a[i]-=10;} } if(a[num2+1]>0)   printf("%d",a[num2+1]); for(i=num2;i>=0;i--)   printf("%d",a[i]); for(i=num1;i>=1;i--) {  if(c[i]==0)     continue;    else     break; } if(i==0); else {   printf(".");    for(j=1;j<=i;j++)      printf("%d",c[j]); } printf("\n");         }    return 0;} hdu 1753

1 0