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;}
这里代码看起来还有点长,伱要是知道了有哪些情况,肿么对付的话,就是一道简单模拟题,如果伱有更好的方法的话,希望大家分享分享!
- 大明A+B hdu1753
- hdu1753----大明A+B
- hdu1753 大明A+B
- hdu1753大明A+B
- hdu1753 大明A+B
- hdu1753大明A+B
- hdu1753 大明A+B
- hdu1753 大明A+B
- HDU1753 大明A+B
- Hdu1753 大明A+B
- hdu1753大明A+B(高精度)
- hdu1753 大明A+B(高精度加法)
- 大明A+B(hdu1753)大数,java
- hdu1753 大明A+B && nyoj 513 A+B Problem IV
- ACM-简单题之大明A+B——hdu1753
- HDU1753—大明A+B(大正小数相加)
- HDU1753 大明A+B(带小数的大数加法)
- hdu1753 大明A+B (java大数练习第二弹 高精度小数)
- NeHe教程Qt实现——lesson17
- Winpcap打开适配器并捕获数据包
- Android 将少量的数据文件保存在 data/data 目录下
- 浅谈C++ 之RAII
- Winpcap打开适配器并捕获数据包:不用回调方法捕获数据包
- hdu1753 大明A+B
- Winpcap打开适配器并捕获数据包:过滤数据包
- 一个简单的注册页面
- Winpcap打开适配器并捕获数据包:解析所捕获的数据包的协议首部
- wamp的80端口被Microsoft-HTTPAPI/2.0占用问题
- android 提升性能总结
- 2012.7.29
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- ORACLE SQL性能优化系列 (二)