
- 这是一道高精度下的实数加法,我们和高精度整数加法的思想一样,只是将数分为两个部分,整数部分和小数部分,在进行相加,最后输出时注意小数部分末尾的0,要处理掉,下面是代码
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=110;
int flag=0;
void ni(char a[])
{
int len=strlen(a);
char b[N];
for(int i=0;i<len;i++)
b[i]=a[i];
for(int i=0;i<len;i++)
a[i]=b[len-1-i];
}
void add(char a[],char b[])
{
ni(a);
ni(b);
int lena=strlen(a),lenb=strlen(b),i,j;
for(i=0;i<lena&&i<lenb;i++){
int t=a[i]-'0'+b[i]-'0'+flag;
a[i]=t%10+'0';
flag=t/10;
}
int max0=i;
for(j=i;j<lena;++j){
int t=a[j]-'0'+flag;
a[j]=t%10+'0';
flag=t/10;
max0=j+1;
}
for(j=i;j<lenb;++j){
int t=b[j]-'0'+flag;
a[j]=t%10+'0';
flag=t/10;
max0=j+1;
}
if(flag==1)
{
a[max0]='1';
a[max0+1]='\0';
}
else
a[max0]='\0';
}
void qu(char a[])
{
int len=strlen(a);
int i=0;
while(a[i]=='0'){
i++;
}
for(int j=0;j<len-i;j++){
a[j]=a[j+i];
}
a[len-i]='\0';
}
int main()
{
char a[N],b[N];
scanf("%s %s",a,b);
int lena=strlen(a),lenb=strlen(b);
char a1[N],a2[N],b1[N],b2[N];
int i,j;
for(i=0;i<lena;i++){
if(a[i]=='.')
break;
a1[i]=a[i];
}
a1[i]='\0';
for(j=i+1;j<lena;j++){
a2[j-i-1]=a[j];
}
a2[j-i-1]='\0';
for(i=0;i<lenb;i++)
{
if(b[i]=='.')
break;
b1[i]=b[i];
}
b1[i]='\0';
for(j=i+1;j<lenb;j++){
b2[j-i-1]=b[j];
}
b2[j-i-1]='\0';
int lena2=strlen(a2),
lenb2=strlen(b2),
mlen=lena2;
if(lena2<lenb2){
for(int i=lena2;i<lenb2;i++){
a2[i]='0';
}
a2[lenb2]='\0';
mlen=lenb2;
}
else if(lena2>lenb2){
for(int i=lenb2;i<lena2;i++){
b2[i]='0';
}
b2[lena2]='\0';
}
add(a2,b2);
a2[mlen]='\0';
qu(a2);
ni(a2);
add(a1,b1);
ni(a1);
printf("%s.%s\n",a1,a2);
return 0;
}