hdu 1753 大明 A+B

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。 

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。 
Input本题目包含多组测试数据,请处理到文件结束。 
每一组测试数据在一行里面包含两个长度不大于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

思路很简单,字符串处理,代码来自《算法设计与实现》,借鉴代码:

#include
#include
#include
using namespace std;
int main(){
	char s1[401],s2[401];
	int a[401],b[401],c[401],d[401];
	int i,j,k,len1,len2,s,t,num1,num2;
	while(scanf("%s%s",s1,s2)!=EOF){
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		memset(d,0,sizeof(d));
	s=len1=strlen(s1);
	t=len2=strlen(s2);
	for(i=0;i=0;j--)
	   a[k++]=s1[j]-'0';
	 k=0;
	 for(j=t-1;j>=0;j--)
	   b[k++]=s2[j]-'0';
	k=1;
	if(s+1len2-t?len1-s:len2-t;
	for(i=num1;i>=1;i--){
		c[i]+=d[i];
		if(c[i]>=10){
			c[i]-=10;
			c[i-1]++;
		}
	}
	num2=s-1>t-1?s-1:t-1;
	a[0]+=c[0];
	for(i=0;i<=num2;i++){
		a[i]+=b[i];
		if(a[i]>=10){
			a[i]-=10;
			a[i+1]++;
		}
	}
	if(a[num2+1]>0)
	   printf("%d",a[num2+1]);
	for(i=num2;i>=0;i--)
	   printf("%d",a[i]);
	for(i=num1;i>=1;i--){
		if(c[i]==0)  continue;
		else break;
	}
	if(i!=0){
		printf(".");
	for(j=1;j<=i;j++)
	   printf("%d",c[j]);
	}
	printf("\n");
}
return 0;
}

你可能感兴趣的:(大数)