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