hdu1753

大明A+B

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


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
#include<stdio.h> #include<string.h> int main() {  int i,j,k,l,len1,len2,flag,sum[1100],p,zb;  char a[1000],b[1000];//把两个加数存分别存放在字符型数组a和b里  while(scanf("%s%s",a,b)!=-1){//输入的两个数字符型   len1=strlen(a);//求出数组a的长度   len2=strlen(b);//求出数组b的长度   memset(sum,0,sizeof(sum));//库函数memeset 将地址sum 开始的sizeof(sum)字节内容置成0   //sizeof(sum)的值就是sum 的长度   //memset 函数在string.h 中声明   k=len1;//把a的长度赋值给K   l=len2;   flag=0;//不含小数点   for(i=0;a[i];i++)    if(a[i]=='.')     break;    k=i+1;//当判断到小数点的时候将小数点在第几位存到k里    if(a[i])//是小数点的时候flag为1     flag=1;   for(j=0;b[j];j++)//同数组a,定义数组b    if(b[j]=='.')     break;    l=j+1;//当判断到小数点的时候将小数点在第几位存到l里    if(b[j])     flag=1;   if(i>j)   {   zb=i+1;//把两数对齐后小数点的位置   }   else   {   zb=j+1;   }   p=zb;//把小数点下标赋值给p   i--;//位数后移   j--;   for(;;i--,j--)//计算小数点之前的部分   {    if(i>=0&&j>=0)//判断两个数是否为0    {sum[p--]=a[i]-'0'+b[j]-'0';}//把字符串转换成数值再相加    else if(i>=0&&j<0)    {sum[p--]=a[i]-'0';}    else if(i<0&&j>=0)    {sum[p--]=b[j]-'0';}    else if(i<0&&j<0)    {break;}   }   p=zb+1;//计算小数点之后的部分    for(;;k++,l++){     if(k<len1&&l<len2)//判断小数点后面是否还有数      sum[p++]=a[k]-'0'+b[l]-'0';//把字符串转换成数值再相加     else if(k<len1&&l>=len2)      sum[p++]=a[k]-'0';     else if(k>=len1&&l<len2)      sum[p++]=b[l]-'0';     else if(k>=len1&&l>=len2)      break;    }    for(i=p-1;i>=0;i--)//进位     if(sum[i]>=10){      sum[i]=sum[i]-10;      sum[i-1]++;     }     i=0;     while(sum[i]==0)//去除前导零      i++;     for(;i<=zb;i++)     printf("%d",sum[i]);//输出整数部分的和     while(sum[p]==0)//去除后导0     p--;     if(p<=zb)//如果结果为整数,去掉小数点     flag=0;    if(flag){//输出整体小数     printf(".");     for(i=zb+1;i<=p;i++)      printf("%d",sum[i]);    }    printf("\n");  }  return 0; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章