A+B Problem IV
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
-
输入
-
包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)
输出
- 每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。 样例输入
-
1.9 0.1 0.1 0.9 1.23 2.1 3 4.0
样例输出
-
2 1 3.33 7
-
包含多组测试数据
实数a+b,只针对整数的运算........
很久以前就想尝试,今天终于搞出来了..........
恶心的要死,调试了一下午,才把所有要考虑的情况考虑到..........
其实就是字符串处理,主要是要注意各种特殊情况...........
献出几组测试数据:
0.1 0.02
0.1 0.9
1 2.0
1.9 0.1
9 10
1.23 2.1
1000 0.01
写的程序比较繁琐,完全是按自己的理解来做的..........
以后有机会再优化吧........
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
char a[1005],b[1005],sum[1005];
void mem()
{
memset(sum,0,sizeof(sum));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
void over(char s[])
{
int len=strlen(s);
for(int i=0;i<len/2;++i)
{
swap(s[i],s[len-i-1]);
}
}
int point(char s[])//找小数点的位置
{
int len=strlen(s);
for(int i=0;i<len;++i)
{
if(s[i]=='.')
{
over(s);
return len-i-1;
}
}
s[len]='.';s[len+1]='0';
return point(s);
}
void move(char s[],int x)
{
int len=strlen(s);
for(int i=len-1;i>=0;--i)
{
s[i+x]=s[i];
}
while(x--)
{
s[x]='0';
}
}
void change(char s[])
{
int len=strlen(s),cnt=0;
for(int i=0;i<len;++i)
{
if(s[i]!='0'&&s[i]!='.')
{
break;
}
else
{
++cnt;
}
if(s[i]=='.')
{
break;
}
}
for(int i=cnt;i<len;++i)
{
s[i-cnt]=s[i];
}
s[len-cnt]=0;
over(s);
}
int main()
{
// freopen("shuju.txt","r",stdin);
while(mem(),~scanf("%s%s",a,b))
{
int pa=point(a),pb=point(b);
if(pa>pb)//对位
{
move(b,pa-pb);
}
else
{
move(a,pb-pa);
}
int cnt=0;
for(int i=0;a[i]||b[i];++i)//累加
{
if(a[i]!='.')
{
sum[i]+=a[i]-(a[i]?'0':0)+b[i]-(b[i]?'0':0);
//++cnt;
}
else
{
sum[i]='.';
}
++cnt;
}
for(int i=0;i<cnt;++i)//进位
{
if(sum[i]!='.')
{
if(sum[i+1]!='.')
{
sum[i+1]+=sum[i]/10;
sum[i]%=10;
}
else
{
sum[i+2]+=sum[i]/10;
sum[i]%=10;
}
sum[i]+='0';
}
while(sum[cnt])
{
++cnt;
}
}
change(sum);//调整
printf("%s\n",sum);
}
return 0;
}
大神的最优代码,然而并没有看懂....555
#include <stdio.h>
#include <string.h>
#define MAX 1000
char a[MAX],b[MAX],c[MAX];
int main()
{
int i,j,k,l,m,n,la,lb,mx;
char ch;
memset(a,'0',sizeof(a));
memset(b,'0',sizeof(b));
while(~scanf("%s%s",a,b))
{
la=strlen(a);
lb=strlen(b);
a[la]='0';
b[lb]='0';
i=0;
while((a[i]-'.')&&i<la)
{
i++;
}
if(i==la)
a[la]='.';
j=0;
while((b[j]-'.')&&j<lb)
{
j++;
}
if(j==lb)
b[lb]='.';
m=(la-i)>(lb-j)?(la-i):(lb-j);
if(i>=j)
{
for(l=mx=i+m,k=0,j=i-j;l>=0;l--)
{
if(a[l]=='.')
{
c[l]='.';
continue;
}
ch=(l-j)<0?'0':b[l-j];
c[l]=(a[l]-'0'+ch-'0'+k)%10+'0';
k=(a[l]-'0'+ch-'0'+k)/10;
}
}
else
{
for(l=mx=j+m,k=0,j=j-i;l>=0;l--)
{
if(b[l]=='.')
{
c[l]='.';
continue;
}
ch=(l-j)<0?'0':a[l-j];
c[l]=(ch-'0'+b[l]-'0'+k)%10+'0';
k=(ch-'0'+b[l]-'0'+k)/10;
}
}
if(k>0)
printf("%d",k);
while(c[mx]=='0')
mx--;
if(c[mx]=='.')
mx--;
for(i=0;i<=mx;i++)
printf("%c",c[i]);
printf("\n");
memset(a,'0',sizeof(a));
memset(b,'0',sizeof(b));
}
}