题目描述
给出两个非负实数a和b,求a+b
输入
一组用例,包括两个长度不大于400的非负实数a和b
输出
输出一行为a+b的最简形式,即没有前置0后置0,小数部分为0则省略小数点
样例输入
1
1
样例输出
2
题目大意:
计算400位以内的非负实数相加。
解题思路:
直接利用计算机处理400位数的实数加法是不可能的,计算机处理的位数有限。所以printf出a+b是行不通的。
利用数组,把每一位数存在一个数组里,再来计算。
提供两种方法;
都先对数据预处理,存入字符数组,找到小数点,没有小数点在最后补上一个小数点,去掉输入数据的前置0,后置0(也可以在最后输出结果时处理)。
•
方法
1
(1)找到小数点后,把小数点前后的数分别存入数组。
(2)对齐每位数再相加,如果相加的数大于9,那么前一位+1,本位%10;从低位往高位加。
(3)把得到的结果存入到一个ans[maxn]数组。
(4)输出时判断,去掉后置0和前置0,结果为整数时没有小数点,为小数时有小数点输出。
•
方法
2
理论上跟方法一是相同的,但在位数相加的时候利用栈的后进先出的性质,分别把小数点前的数和小数点后的数进栈,然后出栈的时候相加。
举个栗子:123.45+6.789
输出,同样注意前置后置0,整数没有小数点,小数输出小数点。
两种方法比较:本质上区别不大,只是方法一用数组存数据,然后把两个数组的数经过位对齐再相加;方法二把数据存进栈,然后不需要对齐,直接出栈相加,得到结果。
ac代码:
#include<stdio.h>
#include<string.h>
const int maxn=1000;
struct stack{
char mm[maxn];
int _front=0;
void push(int num){
if(_front+1<maxn) mm[_front++]=num;
}
void pop(){
if(_front>0) _front--;
}
char top(){
if(_front>0) return mm[_front-1];
else return '0';
}
int size(){//是int不是char
return _front;
}
};
int _max(int a,int b)
{
if(a>=b) return a;
else return b;
}
char a[maxn],b[maxn],ans[maxn];
int main()
{
int i;
memset(ans,'\0',sizeof(ans));
gets(a);
gets(b);
int alen=strlen(a);
int blen=strlen(b);
int apoint,bpoint,atag,btag;
for(i=0;i<alen;i++)
{
if(a[i]=='.')
{
atag=1;
apoint=i;
break;
}
else
{
atag=0;
continue;
}
}
if(atag==0) apoint=alen,a[alen]='.',alen++;
for(i=0;i<blen;i++)
{
if(b[i]=='.')
{
btag=1;
bpoint=i;
break;
}
else
{
btag=0;
continue;
}
}
if(btag==0) bpoint=blen,b[blen]='.',blen++;//ac
stack aa,bb;
for(i=alen-1;i>apoint;i--)
aa.push(a[i]);
for(i=blen-1;i>bpoint;i--)
bb.push(b[i]);//ac
int backmax=_max(aa.size(),bb.size());
for(i=0;i<backmax;i++)
{
ans[backmax-i-1]=aa.top()+bb.top()-'0';//注意减'0'
aa.pop();
bb.pop();
}
for(i=0;i<apoint;i++)
aa.push(a[i]);
for(i=0;i<bpoint;i++)
bb.push(b[i]);
int frontmax=_max(aa.size(),bb.size());
for(i=backmax;i<backmax+frontmax;i++)
{
ans[i]=aa.top()+bb.top()-'0';
aa.pop();
bb.pop();
}
for(i=0;i<backmax+frontmax;i++)
{
if(ans[i]>'9')
{
if(i==backmax+frontmax-1)
{
ans[i+1]='1';
ans[i]=ans[i]-10;
}
else
{
ans[i+1]=ans[i+1]+1;
ans[i]=ans[i]-10;
}
}
}
int length=strlen(ans);
for(i=length-1;i>backmax;i--)//去掉前置0
{
if(ans[i]=='0')
ans[i]='\0';
else break;
}
length=i;
for(i=0;i<backmax;i++)//去掉后置0
{
if(ans[i]!='0')
break;
}
int j=i;
if(backmax==0)
{
for(i=length;i>=0;i--)
{
printf("%c",ans[i]);
}
printf("\n");
}
else
{
if(j==backmax)
{
for(i=length;i>=j;i--)
printf("%c",ans[i]);
printf("\n");
}
else
{
for(i=length;i>=backmax;i--)
printf("%c",ans[i]);
printf(".");
for(i=backmax-1;i>=j;i--)
printf("%c",ans[i]);
printf("\n");
}
}
return 0;
}