hdu 1753 大明A+B

大明A+B

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8353    Accepted Submission(s): 2946


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
解题分析:
题目大意就是大数相加的问题,不过在此题中要注意到给出的书是否带小数点,同时,带小数的对于整数部分为0的,输出0;
思路:对于整数部分,倒着记录,病从小往大相加,对于小数部分,从正着记录,从大往小加。
代码比较长:
#include<stdio.h>
#include<string.h>
  int main()
    {
    	char s1[440];
    	char s2[440];
    	int   a1[440],a2[440];
    	int   b1[440],b2[440];
    	int   c1[440],c2[440];
    	int i,j;
    	int k1,k2;
    	int sum1,sum2;
    	int p,q,t;
    	int len1,len2,len3,len4;
    	int len5,len6;
      while(scanf("%s%s",s1,s2)!=EOF)
        {     k1=k2=1;
        	memset(a1,0,sizeof(a1));
        	memset(a2,0,sizeof(a2));
        	memset(b1,0,sizeof(b1));
        	memset(b2,0,sizeof(b2));
        	memset(c1,0,sizeof(c1));
        	memset(c2,0,sizeof(c2));
			 len5=strlen(s1);
             len6=strlen(s2);
            i=0;
            sum1=0;
            while(s1[i]!='.'&&s1[i]!='\0') {sum1++;i++ ;} //找到小数点,记录位数
              if(sum1==len5)    k1=0;      //同时标记是否为小数 
            j=0;
            sum2=0;
            while(s2[j]!='.'&&s2[j]!='\0')  {sum2++;j++;}//找到小数点,记录位数
               if(sum2==len6)   k2=0;     //同时标记是否为小数
               
         
             
           i=0;
           j=sum1-1;
		   while(j>=0)     //用数组a1记录整数部分
		     {
		     	a1[i]=s1[j]-'0';
		     	i++;
		     	j--;
		     }
			 i=0;
             j=sum2-1;
		   while(j>=0)     //用数组a2记录整数部分
		     {
		     	a2[i]=s2[j]-'0';
		     	i++;
		     	j--;
		     }
			 if(k1==1)  //第一个是小数,就用b1记录小数部分  
			{
			   	i=sum1+1;
			   	j=0;
			while(s1[i]!='\0')
		       {
		      	b1[j]=s1[i]-'0';
		      	j++;
		      	i++;
		       }
			}
			if(k2==1)   //第二个是小数,就用b1记录小数部分
			  { i=sum2+1;
			  j=0;
			  	while(s2[i]!='\0')
		        {
		      	b2[j]=s2[i]-'0';
		      	j++;
		      	i++;
		        }
			  }
			   len1=sum1;
			   len3=sum2;
			   len2=len5-1-sum1;
			   len4=len6-1-sum2;
			  
			   
			if(k1==0&&k2==1)    //一整,二小,总小数部分就是第二小数
			  {
			  	for(i=0;i<len4;i++)
			  	  c2[i]=b2[i];
			  }
			if(k1==1&&k2==0)   //二整,一小,总小数部分就是第一小数
			    {
			    for(i=0;i<len2;i++)
			  	  c2[i]=b1[i]; 
			    } 
			if(len2>len4)
		      {
		      	t=len2;
				len2=len4;
				len4=t;  
		      }
			if(k1==1&&k2==1)   //先将小数部分相加
			    {  q=0;
			    for(j=len4-1;j>=0;j--)
		         {
		       	    t=b2[j]+b1[j]+q;
		       	    c2[j]=t%10;
		       	    q=t/10;
		         }
				  a1[0]+=q;   //注意将小数最后一位进位进到整数部分	
			    }
		     if(len1>len3)
		     {
		     	t=len1;
		     	len1=len3;
		     	len3=t;
		     }
		      p=0;
		    for(j=0;j<len3;j++)    //整数部分相加
		       {
		       	t=a2[j]+a1[j]+p;
		       	c1[j]=t%10;
		       	p=t/10;
		       }
		        c1[len3]=p;
		     
		       j=len3;
		     while(c1[j]==0&&j>-1)  j--;
		        if(j==-1)   printf("0");
		         else
		      for(;j>=0;j--)
		        printf("%d",c1[j]);
		    if(!(k1==0&&k2==0))
			 {
			   
			    i=len4;
			while(c2[i]==0&&i>-1)   i--;
			   if(i>=0)
			     { printf(".");
			     	 for(j=0;j<=i;j++)
			    printf("%d",c2[j]);
			     }	 	
			 } printf("\n"); 
        }
    	return 0;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值