大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12479 Accepted Submission(s): 4536
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
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define MAX 410
using namespace std;
int main()
{
int w1,w2,l1,l2,p;//w1,w2分别表示第一个数和第二个数小数点的位置,l1,l2分别表示数字的长度,p表示进位
int i,j,k;
char n1[MAX],n2[MAX];
int n[MAX],m[MAX];
while(~scanf("%s %s",n1,n2))
{
memset(n,0,sizeof(n));//初始化
memset(m,0,sizeof(m));
l1=strlen(n1);l2=strlen(n2);
for(i=0;i<l1;i++)//获取两个数小数点的位置
{
if(n1[i]=='.')
{
w1=i;
break;
}
}
if(i==l1)//若为整数补全小数部分
{
w1=l1;
n1[w1]='.';
n1[w1+1]='0';
l1=l1+2;
}
for(i=0;i<l2;i++)
{
if(n2[i]=='.')
{
w2=i;
break;
}
}
if(i==l2)
{
w2=l2;
n2[w2]='.';
n2[w2+1]='0';
l2=l2+2;
}
//求小数部分(直接相加)
k=0;p=0;
for(i=w1+1;i<l1;i++)
{
m[k]=n1[i]-'0';
k++;
}
k=l2-w2-2;
for(i=l2-1;i>w2;i--)
{
m[k]+=(n2[i]-'0')+p;;
p=m[k]/10;
m[k]=m[k]%10;
k--;
}
//求整数部分
k=0;
for(i=w1-1,j=w2-1;i>=0&&j>=0;i--,j--)
{
n[k]+=n1[i]-'0'+n2[j]-'0'+p;
p=n[k]/10;
n[k]=n[k]%10;
k++;
}
for(i=i;i>=0;i--)
{
n[k]+=n1[i]-'0'+p;
p=n[k]/10;
n[k]=n[k]%10;
k++;
}
for(j=j;j>=0;j--)
{
n[k]+=n2[j]-'0'+p;
p=n[k]/10;
n[k]=n[k]%10;
k++;
}
if(p!=0)
{
n[k]=p;
k++;
}
for(i=MAX-1;i>=0;i--)//求要输出的不为0的数开始的位置
{
if(n[i]!=0)
break;
}
if(i!=-1)//把整数输出
{
for(k=i;k>=0;k--)//此处不能用i,否则会影响下面的数i的判断
{
printf("%d",n[k]);
}
}
for(j=MAX-1;j>=0;j--)
{
if(m[j]!=0)
break;
}
if(i==-1&&j==-1)//如果全部为0,直接输出0
{
printf("0\n");
}
if(i==-1&&j>=0)//只有小数的时候输出前提
{
printf("0.");
for(k=j;k>=0;k--)
{
printf("%d",m[k]);
}
}
if(i>=0&&j!=-1)//分别分情况讨论
{
printf(".");
for(k=0;k<=j;k++)
{
printf("%d",m[k]);
}
}
printf("\n");
}
return 0;
}