小学期 a+b

题目描述

给出两个非负实数a和b,求a+b

输入

一组用例,包括两个长度不大于400的非负实数a和b

输出

输出一行为a+b的最简形式,即没有前置0后置0,小数部分为0则省略小数点

样例输入

1

1

样例输出

2

题目大意:

  计算400位以内的非负实数相加。

解题思路:

  直接利用计算机处理400位数的实数加法是不可能的,计算机处理的位数有限。所以printfa+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;
}

猜你喜欢

转载自blog.csdn.net/silvester123/article/details/77916848
A+B