大明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专场
解题思路:
1、把数据当作字符串输入。
2、判断小数点的位置。
3、把小数和整数部分分开,并且分别保存在不同的数组里面。
4、先把小数部分依次相加,注意进位。
5、把整数部分依次相加。
6、判断是否有小数部分。
7.输出。。。
注意事项:一定要先加小数,后加整数,因为小数部分也有可能向前进位。
程序代码:
#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]=='.') // 测出d小数点的位置。
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; //一定要把变量赋初值 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; // 十位 向前进 。。。注意:p变量的初值是小数部分的最后一次进位的值(0或 1)
else
p=0;
}
if(y[q]>0) //判断 整数的最高位是否为0,若不为0 则把数组长度加一。(方便输出)。
q=q+1;
for(i=q-1;i>=0;i--)
printf("%d",y[i]); //输出整数部分
while(x[j-1]==0) // 判断小数部分的最后一位是否为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;
}