带小数点的大数加法,思路:1、记录小数点的位置,然后把他去掉,因为带小数点遇到进位不好算。2、按照大数加法,将没有小数点的大数加起来。(加的过程中如果记录到小数点位置,就把小数点加上)3、把小数部分多余的0去掉。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 410;
char a[maxn], b[maxn];
int s[maxn+maxn];
int main()
{
char c;
int alc, arc, blc, brc, i,j,k,l,len,sign;
while(scanf("%c", &c) != EOF)
{
memset(s,0,sizeof(s));
i=0;
alc = 0;
arc = 0;
while(c != '.' && c != ' ')
{
a[i++] = c;
alc++;
scanf("%c", &c);
}
a[i++] = c;
if(c != ' ')
{
scanf("%c", &c);
while(c != ' ')
{
a[i++] = c;
arc++;
scanf("%c", &c);
}
}
k=i-1;
blc = 0;
brc = 0;
i=0;
while((c=getchar()) != '.' && c != '\n')
{
b[i++] = c;
blc++;
}
b[i++] = c;
if(c != '\n' && c != EOF)
{
while((c=getchar()) != '\n' && c != EOF)
{
b[i++] = c;
brc++;
}
}
l = i-1;
j=0;
if(brc < arc)
{
len = arc-brc;
while(len--)
s[j++] = a[k--]-48;
}
else if(brc > arc)
{
len = brc-arc;
while(len--)
s[j++] = b[l--]-48;
}
len = min(arc,brc);
sign = 0;
for(i=1; i<=len; i++)
{
s[j] = sign + a[k]-48 + b[l]-48;
if(s[j] > 9)
{
sign = 1;
s[j] %= 10;
}
else
sign = 0;
j++;
l--;
k--;
}
s[j++] = -1;
k--;
l--;
while(k>=0 || l>=0)
{
s[j] = sign+((k>=0) ? a[k] : '0')-48+((l>=0) ? b[l] : '0')-48;
if(s[j] > 9)
{
sign = 1;
s[j] %= 10;
}
else
sign = 0;
j++;
k--;
l--;
}
if(sign == 1)
s[j++] = 1;
k=0;
while(s[k] == 0)
{
k++;
}
if(s[k] == -1)
k++;
for(i=j-1; i>=k; i--)
{
if(s[i] == -1)
{
cout << '.';
continue;
}
cout << s[i];
}
cout << endl;
}
return 0;
}