hdu1753 大明A+B

来源:互联网 发布:国内互联网网络股票 编辑:程序博客网 时间:2024/05/19 11:34

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

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

我的代码如下:

#include<cstdio>#include<cstring>#include<cmath>#define Maxn 310int 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;}

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

原创粉丝点击