大明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的值。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
每一组测试数据在一行里面包含两个长度不大于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; }