這時他已經不是那個只會做100以內加法的那個“小明”了,現在他甚至會任意長度的正小數的加法。
現在,給你兩個正的小數A和B,你的任務是代表大明計算出A+B的值。
Input
每一組測試數據在一行裏面包含兩個長度不大於400的正小數A和B。
Output
Sample Input
Sample Output
2.1
參考:利用1000的大空間來分段處理。
#include<cstdio>
#include<iostream>
#include<cstring>
#define Max 1010
char str1[Max],str2[Max],ans[Max],temp1[Max],temp2[Max];
void Calculate()
{
int i,j,k,p,q,n,s,c;
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));
memset(ans,0,sizeof(ans));
n=strlen(temp1);
if(strchr(temp1,'.')==NULL)
k=n;
else
k=strchr(temp1,'.')-temp1;
for(i=k-1,j=500;i>=0;i--,j++)
str1[j]=temp1[i]-'0';
for(i=k+1,j=499;i<n;i++,j--)
str1[j]=temp1[i]-'0';
n=strlen(temp2);
if(strchr(temp2,'.')==NULL)
k=n;
else
k=strchr(temp2,'.')-temp2;
for(i=k-1,j=500;i>=0;i--,j++)
str2[j]=temp2[i]-'0';
for(i=k+1,j=499;i<n;i++,j--)
str2[j]=temp2[i]-'0';
c=0;
for(i=0;i<1010;i++)
{
s=str1[i]+str2[i]+c;
ans[i]=s%10;
c=s/10;
}
return ;
}
void Output()
{
int i,j;
for(i=1009;i>500;i--)
if(ans[i])
break;
for(;i>=500;i--)
printf("%d",ans[i]);
for(j=0;j<500;j++)
if(ans[j])
break;
if(j!=500)
{
printf(".");
for(i=499;i>=j;i--)
printf("%d",ans[i]);
}
printf("\n");
}
int main()
{
while(~scanf("%s %s",&temp1,&temp2))
{
Calculate();
Output();
}
return 0;
}
自己的還沒找出錯誤:
//先將小數變成整數
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <stack>
#include <set>
#include <map>
#include <string>
using namespace std;
#define pi acos(-1,0)
#define INF 2147483647
int max(int a,int b)
{
return a>=b?a:b;
}
int main()
{
int l1,l2,x1,x2,z1,z2,maxx,maxz;
int i,j,flag;
char s1[850],s2[850];
int ss1[850],ss2[850];
int ans[850];
while(scanf("%s %s",s1,s2)!=EOF)
{
memset(ss1,0,sizeof(ss1));
memset(ss2,0,sizeof(ss2));
memset(ans,0,sizeof(ans));
l1=strlen(s1);
l2=strlen(s2);
flag=0;
if(s1[0]=='0' && s2[0]=='0' && l1==l2 && l1==0)
{
printf("0\n");
continue;
}
for(i=0;i<l1;i++)
{
if(s1[i]=='.')
break;
}
if(i!=l1)
{
x1=l1-i-1;
z1=i;
}
else
{
x1=0;
z1=i;
}
for(i=0;i<l2;i++)
{
if(s2[i]=='.')
break;
}
if(i!=l2)
{
x2=l2-i-1;
z2=i;
}
else
{
x2=0;
z2=i;
}
maxx=max(x1,x2);
maxz=max(z1,z2);
for(i=z1-1,j=0;i>=0;i--,j++)
{
ss1[maxz-j]=s1[i]-'0';
}
for(i=l1-x1,j=1;i<l1;i++,j++)
{
ss1[maxz+j]=s1[i]-'0';
}
// for(i=0;i<=maxx+maxz;i++)
// printf("%d",ss1[i]);
for(i=z2-1,j=0;i>=0;i--,j++)
{
ss2[maxz-j]=s2[i]-'0';
}
for(i=l2-x2,j=1;i<l2;i++,j++)
{
ss2[maxz+j]=s2[i]-'0';
}
// for(i=0;i<=maxx+maxz;i++)
// printf("%d",ss2[i]);
for(i=maxx+maxz;i>0;i--)
{
if(ss1[i]+ss2[i]>9)
{
ss1[i-1]++;
ans[i]=ss1[i]+ss2[i]-10;
}
else
ans[i]=ss1[i]+ss2[i];
}
for(i=maxx+maxz;i>maxz;i--)
{
if(ans[i]!=0)
{
flag=1;
break;
}
}
for(i=maxx+maxz;i>=0;i--)
{
if(ans[i]!=0)
break;
}
j=i;
for(i=0;i<=j;i++)
{
if(i==0 && ans[0]!=0)
printf("%d",ans[i]);
else if(i==maxz && flag==1)
{
printf("%d",ans[i]);
printf(".");
}
else if(i!=0)
printf("%d",ans[i]);
}
printf("\n");
}
return 0;
}