其他分享
首页 > 其他分享> > HDU-1753:大明A+B(仔细一点耐心一点)

HDU-1753:大明A+B(仔细一点耐心一点)

作者:互联网

问题描述

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

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

输入

本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

输出

请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

输入样例

1.1 2.9
1.1111111111 2.3444323343
1 1.1

样例输出

4
3.4555434454
2.1

这个代码真的写吐了,还是需要自己把思路捋一捋吧,代码还有一些其实多余的地方,可以优化一下。不确定自己哪里错了的话,其实可以再去找一下其他样例测试一下。

AC代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<map>
#define ll long long
using namespace std;
char a[505],b[505];//存储输入 
int a1[505],b1[505];
int sum[505];//存储最后结果 
int main()
{
	while(~scanf("%s %s",a,b))
	{
		memset(sum,0,sizeof(sum)); 
		int p,q,pd,qd;
		p=q=-1;
		pd=qd=0;//判断有没有小数点 
		int kk = -1;//用于位数的计数 
		int i=0;
		// 先将小数点后面的进行加法运算 
		while(a[i]!='.'&&a[i]) i++;
		if(a[i]=='.')
		{
			pd=1;
			for(i=i+1;a[i];i++) a1[++p]=a[i]-'0';
		}
		i=0;
		while(b[i]!='.'&&b[i]) i++;
		if(b[i]=='.')
		{
			qd=1;
			for(i=i+1;b[i];i++) b1[++q]=b[i]-'0';
		}
		//小数点后面的位数可能不一样,不一样的直接后面补零 
		if(p<q)
		{
			for(int i=p+1;i<=q;i++) a1[i]=0;
			p=q;
		}
		else if(p>q)
		{
			for(int i=q+1;i<=p;i++) b1[i]=0;
			q=p;
		}
		//小数点后面的相加 
		for(int i=p;i>=0;i--)
		{
			sum[++kk]+=a1[i]+b1[i];
			if(sum[kk]>9&&i!=0)
			{
				sum[kk+1]++;
				sum[kk]-=10;
			}
		}
		//存储小数点前面的数 
		p=q=-1;
		for(int i=0;a[i]!='.'&&a[i];i++) a1[++p]=a[i]-'0';
		for(int i=0;b[i]!='.'&&b[i];i++) b1[++q]=b[i]-'0';
		//小数点后面可能需要进位 
		if(sum[kk]>9)
		{
			sum[kk+1]++;
			sum[kk]-=10;
		}
		kk++;
		sum[kk+1]=sum[kk];
		sum[kk]=-1;//标志小数点的位置 
		
		if(kk==-1) kk=0;//可能没有小数点
		//小数点前面的数字相加 
		if(p==q)
		{
			
			for(int i=p;i>=0;i--)
			{
				sum[++kk]+=a1[i]+b1[i];
				if(sum[kk]>9)
				{
					sum[kk+1]++;
					sum[kk]-=10;
				}
			}
		}
		//前面的位数也可能不等
		else if(p>q)
		{
			while(p>=0&&q>=0)
			{
				sum[++kk]+=a1[p]+b1[q];
				if(sum[kk]>9)
				{
					sum[kk+1]++;
					sum[kk]-=10;
				}
				p--;
				q--;
			}
			 
			for(int i=p;i>=0;i--)
			{
				sum[++kk]+=a1[i];
				if(sum[kk]>9)
				{
					sum[kk+1]++;
					sum[kk]-=10;
				}
			}
		}
		else if(p<q)
		{
			while(p>=0&&q>=0)
			{
				sum[++kk]+=a1[p]+b1[q];
				if(sum[kk]>9)
				{
					sum[kk+1]++;
					sum[kk]-=10;
				}
				p--;
				q--;
			}
			
			for(int i=q;i>=0;i--)
			{
				sum[++kk]+=b1[i];
				if(sum[kk]>9)
				{
					sum[kk+1]++;
					sum[kk]-=10;
				}
			}
		}
		
		int j=0;
		while(sum[j]==0) j++;//去除后导零 
		if(sum[kk+1]) kk++;//最后相加的时候产生了进位,位数要加1 
		if(sum[kk]==0&&sum[kk-1]!=-1) kk--;//去除后导零 
		for(int i=kk;i>=j;i--)
		{
			if(sum[i]==-1&&i!=j) printf(".");
			else if(sum[i]!=-1) printf("%d",sum[i]);
		}
		printf("\n");
	}
	return 0;
}
菜菜GMJ 发布了6 篇原创文章 · 获赞 12 · 访问量 972 私信 关注

标签:HDU,kk,sum,++,int,b1,&&,一点,1753
来源: https://blog.csdn.net/qq_43550449/article/details/104077104