大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8477 Accepted Submission(s): 2999
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
思路:将两个数变成一样的长度,不足的在后面补上0(非小数的加上小数点再补零),然后倒着往前加,遇到小数点了先保存起来,输出小数点所在位置即可;
参考代码:
#include<stdio.h>
#include<string.h>
char a[800],b[800];
char c[800],d[800];
int main(void)
{
int m,n,i,x,z,y,o,p,q,j;
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));
memset(d,'\0',sizeof(d));
while(scanf("%s %s",a,b)!=EOF)
{
x=strlen(a);
m=x;
y=strlen(b);
n=y;
for(i=0;i<=x-1;i++)
if(a[i]=='.') {m=i;break;}
if(m==x) a[m]='.';
for(i=0;i<=y-1;i++)
if(b[i]=='.') {n=i;break;}
if(n==y) b[n]='.';
for(i=x+y-n+3,j=0;i>=0;i--)
{
if(a[i]>='0'&&a[i]<='9') c[j++]=a[i]-'0';
else c[j++]=a[i];
}
for(i=x+y-m+3,j=0;i>=0;i--)
{
if(b[i]>='0'&&b[i]<='9') d[j++]=b[i]-'0';
else d[j++]=b[i];
}
for(i=0,z=0;i<=x+y+3;i++)
{
if(c[i]!='.')
{
q=c[i]+d[i]+z;
c[i]=q%10;
z=q/10;
}
}
for(i=x+y+3;i>=0&&c[i]==0&&c[i-1]!='.';i--);
for(j=0;j<=x+y+3&&c[j]==0&&c[j+1]!='.';j++);
for(;i>=j;i--)
if(c[i]=='.'&&c[i-1]==0&&i-1==j) break;
else
{
if(c[i]=='.')
printf("%c",c[i]);
else
printf("%c",c[i]+'0');
}
printf("\n");
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));
memset(d,'\0',sizeof(d));
}
return 0;
}
另附自己还用C++写了一个代码,所有的测试数据都对,但就是WA,还恳请看到的大神帮忙看一下哪里错了,非常感谢;
下面是代码:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int main()
{
int i,j,x,len1,len2,ii,jj,n;
string a,b,c,d,e,f,xiao;
int s1[10000],s2[10000];
a.clear();
b.clear();
while(cin>>a>>b)
{
ii=0;
jj=0;
j=0;
c.clear();
d.clear();
e.clear();
f.clear();
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
len1=a.length();
len2=b.length();
x=a.find(".");
if(x!=-1)//第一个
{
c=a.substr(0,x);
d=a.substr(x+1,len1-x-1);
ii=len1-x-1;
}
else
c=a.substr(0,len1);//提取字串;
j=0;
if(x!=-1)
{
for(i=x-1;i>=0;i--)
s1[j++]=a[i]-'0';
}
else
for(i=0;i<len1;i++)
s1[j++]=a[i]-'0';
x=b.find(".");
if(x!=-1)//第二个;
{
e=b.substr(0,x);
f=b.substr(x+1,len2-x-1);
jj=len2-x-1;
}
else
e=b.substr(0,len2);
j=0;
if(x!=-1)
{
for(i=x-1;i>=0;i--)
s2[j++]=b[i]-'0';
}
else
{
for(i=len2-1;i>=0;i--)
s2[j++]=b[i]-'0';
}
int k=0;
if(ii>jj)
{
for(i=jj-1;i>=0;i--)
{
d[i]=d[i]-'0'+f[i]-'0'+k;
k=d[i]/10;
d[i]=d[i]%10+'0';
}
xiao=d;
}
else
{
for(i=ii-1;i>=0;i--)
{
f[i]=d[i]-'0'+f[i]-'0'+k;
k=f[i]/10;
f[i]=f[i]%10+'0';
}
xiao=f;
}
int max=e.length()>c.length()?e.length():c.length();
for(i=0;i<=max+2;i++)
{
s1[i]+=s2[i]+k;
k=s1[i]/10;
s1[i]=s1[i]%10;
}
for(i=max+2;s1[i]==0&&i>0;i--);
for(;i>=0;i--)
cout<<s1[i];
int m=xiao.length();
for(i=m-1;i>=0;i--)
{
if(xiao[i]=='0')
{
m--;
xiao[i]='\0';
}
else
break;
}
if(m)
{
cout<<"."<<xiao<<endl;
}
else
cout<<endl;
}
return 0;
}