hdu 大明A+B

大明A+B

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 44   Accepted Submission(s) : 9

Font: Times New Roman | Verdana | Georgia

Font Size:

Problem Description

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

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

Input

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

Output

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

Sample Input

1.1 2.9
1.1111111111 2.3444323343
1 1.1

Sample Output

4
3.4555434454
2.1

Author

linle

Source

2007省赛集训队练习赛(6)_linle专场
 
思路分析:我们可以把输入的两个数据都是正小数。因此通过找小数点把输入的每一个数据分成整数部分和小数部分,我们再整数部分右对齐,采用倒序相加,小数部分如此
 

#include<stdio.h>
#include<string.h>
#define N 500
int main()
{
 int n,m,i,j,c[N],d[N],e[N],f[N],x[N],y[N],t,k,s,p,q;
 char a[N],b[N];
 while(scanf("%s %s",a,b)!=EOF)
 {
  memset(c,0,sizeof(c));  //初始化
  memset(d,0,sizeof(d));
  memset(e,0,sizeof(e));
  memset(f,0,sizeof(f));
  t=m=strlen(a);
  k=n=strlen(b);
  for(i=0;i<m;i++)    //找第一个数据的小数点,将小数点的位置
  {
   if(a[i]=='.')
    t=i;
   
  }
  for(i=0;i<n;i++)  ////找第=个数据的小数点,将小数点的位置
  { 
   if(b[i]=='.')
    k=i;
   
  }
  for(i=0,j=t-1;i<t;i++)   
  { c[i]=a[j]-'0';j--;}
  for(i=0,j=k-1;i<k;i++)
  {   d[i]=b[j]-'0';j--;}
  for(i=t+1,j=0;i<m;i++)
  { e[j]=a[i]-'0';j++;}
  for(i=k+1,j=0;i<n;i++)
  { f[j]=b[i]-'0';j++;}
  j=q=0;
  if((m-t)<(n-k))         
   j=n-k;
  else
   j=m-t;
  for(i=j-1,p=0;i>=0;i--)
  {
   x[i]=(e[i]+f[i]+p)%10;
   if(e[i]+f[i]+p>9)
    p=(e[i]+f[i]+p)/10; 
   else
    p=0;
  }
  if(t<k)
   q=k;
  else
   q=t;
  for(i=0;i<=q;i++)
  {
   y[i]=(c[i]+d[i]+p)%10;
   if(c[i]+d[i]+p>9)
    p=(c[i]+d[i]+p)/10;
   else
    p=0;
  }
  
        if(y[q]>0)            //考虑进位
   q=q+1;
  for(i=q-1;i>=0;i--)
  printf("%d",y[i]);
  while(x[j-1]==0)    //消除0
  {
    if(x[j-1]==0)
    j=j-1;
  }


  if(j>0)
   printf(".");
 
  for(i=0;i<j;i++)
   printf("%d",x[i]);

 
  printf(" ");
 }
 return 0;
}

原文地址:https://www.cnblogs.com/songmingtao/p/3224360.html