hdu1753 大明A+B

          一眼看见这道的时候,首先就想到了模拟,然后就一直写一直写,虽然是一种笨的方法,不过,要一行一行敲的话,还可以练练代码速度,哼哼!

边写的时候脑海里边要想着有些什么情况比如说一个小数一个整数,小数是0的情况等等,然后,这就是一道纯的模拟题了!

我的代码如下:

#include<cstdio>
#include<cstring>
#include<cmath>
#define Maxn 310

int an[Maxn],ann[Maxn],xn[Maxn],xnn[Maxn];//分别表示两整数左右两部分 
	//an表示A的整数部分,xn表示B的整数部分,另外两个是小数部分! 
char st[Maxn],sv[Maxn];//两整数用字符型读入 
void debug(){//调试所用 
	for(int i=0;i<Maxn;i++)
	printf("%d",an[i]);
	puts("");
}
int main(){
	int i,j,k,t;
	bool flaga,flagb;
	while(~scanf("%s %s",st,sv)){
		flaga=flagb=false;//标记是否为整数 
		memset(an,0,sizeof(an));//这些行memset()是用来清0的 
		memset(ann,0,sizeof(ann));
		memset(xn,0,sizeof(xn));
		memset(xnn,0,sizeof(xnn));
		for(k=1;st[k]!=0;k++)
		if(st[k]=='.'){//发现小数点,左右存进数组 
			for(i=k-1,t=0;i>=0;i--)	an[t++]=st[i]-'0';
			for(t=0,i=k+1;st[i]!=0;i++) ann[t++]=st[i]-'0';
			flaga=true;
			break;
		}
		if(!flaga){//如果A是整数 
			for(t=0,i=strlen(st)-1;i>=0;i--)
				an[t++]=st[i]-'0';
		}
		for(k=1;sv[k]!=0;k++)
		if(sv[k]=='.'){
			for(i=k-1,t=0;i>=0;i--)	xn[t++]=sv[i]-'0';
			for(t=0,i=k+1;sv[i]!=0;i++) xnn[t++]=sv[i]-'0';
			flagb=true;
			break;
		}
		if(!flagb){//如果B为整数 
			for(t=0,i=strlen(sv)-1;i>=0;i--)
				xn[t++]=sv[i]-'0';
		}
		if(!flaga&&!flagb){//如果都是整数做此if 
			for(i=0;i<Maxn;i++){
				an[i]+=xn[i];
				if(an[i]>9){
					an[i+1]+=an[i]/10;
					an[i]%=10;
				}
			}
			bool flag=false;
			for(i=Maxn;i>=0;i--){
				if(flag) printf("%d",an[i]);
				else if(an[i]){
					flag=true;
					printf("%d",an[i]);
				}
			}
			puts("");
			continue;
		}
		if(!flaga&&flagb){//A是整数,B不是 
			for(i=0;i<Maxn;i++){
				an[i]+=xn[i];
				if(an[i]>9){
					an[i+1]+=an[i]/10;
					an[i]%=10;
				}
			}
			bool flag=false;
			for(i=Maxn-1;i>=0;i--){//小心是maxn-1,我Maxn的时候错了! 
				if(flag) printf("%d",an[i]);
				else if(an[i]){
					flag=true;
					printf("%d",an[i]);
				}
			}
			int sp=-1;
			for(i=Maxn-1;i>=0;i--){
				if(xnn[i]){
					sp=i;
					break;
				}
			}
			if(sp==-1){//如果小数部分全部是0以下同此 
				puts("");
				continue;
			}
			else{
				printf(".");
				for(i=0;i<=sp;i++)
				printf("%d",xnn[i]);
			}
			puts("");
			continue;
		}
		if(flaga&&!flagb){//A不是整数,B是: 
			for(i=0;i<Maxn;i++){
				an[i]+=xn[i];
				if(an[i]>9){
					an[i+1]+=an[i]/10;
					an[i]%=10;
				}
			}

			bool flag=false;
			for(i=Maxn-1;i>=0;i--){
				if(flag) printf("%d",an[i]);
				else if(an[i]){
					flag=true;
					printf("%d",an[i]);
				}
			}
			int sp=-1;
			for(i=Maxn-1;i>=0;i--)
				if(ann[i]){
					sp=i;
					break;
				}
			if(sp!=-1){
				printf(".");
				for(i=0;i<=sp;i++){
					printf("%d",ann[i]);
				}
			}
			puts("");
			continue;
		}//下面是 A和B都是浮点数! 
		for(i=Maxn-1;i>0;i--){//先加小数部分 
			ann[i]+=xnn[i];
			if(ann[i]>9){
				ann[i-1]+=ann[i]/10;
				ann[i]%=10;
			}
		}
		ann[0]+=xnn[0];//ann[0] 要特判可能要进位 
		if(ann[0]>9){
			an[0]+=ann[0]/10;
			ann[0]%=10;
		}
		for(i=0;i<Maxn;i++){//整数部分相加(一定要在小数部分先加之后) 
			an[i]+=xn[i];
			if(an[i]>9){
				an[i+1]+=an[i]/10;
				an[i]%=10;
			}
		}
		bool flag=false;//下面是输出 
		for(i=Maxn-1;i>=0;i--){
			if(flag) printf("%d",an[i]);
			else if(an[i]){
				flag=true;
				printf("%d",an[i]);
			}
		}
		int sp=-1;
		for(i=Maxn-1;i>=0;i--){
			if(ann[i]){
				sp=i;
				break;
			}
		}
		if(sp==-1){
			puts("");
			continue;
		}	
		else{
			printf(".");
			for(i=0;i<=sp;i++)
			printf("%d",ann[i]);
		}
		puts("");
	}
	return 0;
}

这里代码看起来还有点长,伱要是知道了有哪些情况,肿么对付的话,就是一道简单模拟题,如果伱有更好的方法的话,希望大家分享分享!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值