HDOJ 1753 明朝A+B
http://acm.hdu.edu.cn/showproblem.php?
pid=1753
大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8296 Accepted Submission(s): 2929
这时他已经不是那个仅仅会做100以内加法的那个“小明”了。如今他甚至会随意长度的正小数的加法。
如今,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
每一组測试数据在一行里面包括两个长度不大于400的正小数A和B。
具体要求请见Sample Output。
先计算小数位的和,由于十分位可能向各位进位,进位时a[0]+=1即可。然后后边直接用;
然后计算整数位的和。也就是大数相加,仅仅是应该注意把字符串中的数存到a[]时。要写成a[j]+=s1[i]-'0',由于要考虑进位
/*思路清晰,算法仅仅用到了大数,但里边须要注意的地方非常多
先计算小数位的和。由于十分位可能向各位进位,进位时a[0]+=1即可,然后后边直接用;
然后计算整数位的和,也就是大数相加,仅仅是应该注意把字符串中的数存到a[]时。要写成a[j]+=s1[i]-'0',由于要考虑进位
*/
#include<stdio.h>
#include<string.h>
#define MAX 450
int main()
{int a[MAX],b[MAX],num_1[MAX],num_2[MAX],i,j,k,n;char s1[MAX],s2[MAX];while(~scanf("%s %s",s1,s2)){memset(num_1,0,sizeof(num_1));memset(num_2,0,sizeof(num_2));memset(a,0,sizeof(a));memset(b,0,sizeof(b));n=strlen(s1);for(i=0;i<n;i++)//s1[i]为小数点 if(s1[i]=='.') break; for(k=0,j=n-1;j>i;j--,k++)//s1有k位小数 num_1[k]=s1[j]-'0';int i_1=i,k_1=k,n_1=n;n=strlen(s2);for(i=0;i<n;i++)//s2[i]为小数点 if(s2[i]=='.') break;for(k=0,j=n-1;j>i;j--,k++)//s2有k位小数 num_2[k]=s2[j]-'0';int i_2=i,k_2=k,n_2=n;if(k_1>=k_2)//小数相加,注意十分位进位的情况 //分两这情况(k_1>=k_2)和(k_1<k_2)是由于不确定哪个小数点后的位数大 {//假设k_1>=k_2,把计算的结果放到num_1[]中 for(i=k_1-k_2,j=0;i<k_1;i++,j++){num_1[i]+=num_2[j];if(num_1[i]>=10){num_1[i]-=10;num_1[i+1]+=1;}//printf("%d#\n",num_1[i]);}if(num_1[i]==1)//十分位进到个位 {num_1[i]-=1;a[0]+=1;}}else if(k_2>k_1)//假设k_2>k_1,把计算的结果放到num_2中。
{ for(i=k_2-k_1,j=0;i<k_2;i++,j++) { num_2[i]+=num_1[j]; if(num_2[i]>=10) { num_2[i]-=10; num_2[i+1]+=1; } } if(num_2[i]==1)//十分位进到个位 { num_2[i]-=1; a[0]+=1; } } //上边小数位相加分两种情况。下边小数位的输出也分两种情况 for(j=0,i=i_1-1;i>=0;i--,j++)//这里是a[j]+=s1[i]-'0',由于考虑到小数会给a[0]进位。
a[j]+=s1[i]-'0'; //这里事实上仅仅给a[0]+=s1[o]-'0',其余还是a[j]=s1[i]-'0',仅仅是这样写和把a[0]独分出来效果一样,就这样写了 for(j=0,i=i_2-1;i>=0;i--,j++)//给b[0]赋值时和a[]一样 b[j]=s2[i]-'0'; for(i=0;i<MAX;i++)//计算整数部分。存到a[]中 { a[i]+=b[i]; if(a[i]>=10) { a[i]-=10; a[i+1]+=1; } } for(i=MAX-1;i>0;i--)//输出整数部分 if(a[i]!=0) break; for(;i>=0;i--) printf("%d",a[i]); if(k_1>=k_2)//输出小数部分 { for(i=k_1-1;i>=0;i--)//这里的for循环是推断小数点后是否有值,假设没有值,循环进行究竟。最后i是-1 if(num_1[i]!=0) break;//假设i==-1。则不运行下边if(i!=-1),也就是不输出小数点和小数点后边的0 for(j=0;j<k_1;j++)//这个for循环的作用是不输出计算得到的小数后边的0,如1.028+1.072。
在for之前结果是2.100,运行完for就把 后边的0去掉,结果为2.1 if(num_1[j]!=0) break; if(i!=-1)//假设小数点后边有值,输出小数点和后边的数 { printf("."); for(i=k_1-1;i>=j;i--) printf("%d",num_1[i]); } } else if(k_1<k_2)//这里的if和上边一样 { for(i=k_2-1;i>=0;i--) if(num_2[i]!=0) break; for(j=0;j<k_2;j++) if(num_2[j]!=0) break; if(i!=-1) { printf("."); for(i=k_2-1;i>=j;i--) printf("%d",num_2[i]); } } printf("\n"); } return 0; } /* 0 0 1.2333 1.2667 99999 1 12121213213124342545354545 13312312321312321321.02300000000000000000000000000 1.0001 1.00002 99999.889 0.111 1000.0 10000.0 112233.1 333.9 123450000 777 123400000 777.700 0.000 0.0000 1212121212.1111111 21212121.33300000000000000 */
版权声明:本文博主原创文章。博客,未经同意不得转载。
转载于:https://www.cnblogs.com/bhlsheji/p/4874500.html
HDOJ 1753 明朝A+B相关推荐
- HDOJ ACM 题目
转载 HDOJ 题目分类(转) 1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 H ...
- 明朝是中国历史上最有骨气的王朝?【ZZ】
linked from http://www.guoxue.com/article/list.asp?id=6095 明朝是中国历史上最有骨气的王朝?作者: (国学网2006-5-12发布) 有人 ...
- 并查集 HDOJ 1232 畅通工程
题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...
- 【HDOJ 3652】B-number
[HDOJ 3652]B-number 给一整数n 找<=n的整数中能被13整除且含有13的 数位dp 记忆化! . 一入记忆化深似海. ..再也不想用递推了...发现真的非常好想 仅仅要保证满 ...
- 【HDOJ】4343 Interval query
最大不相交集合的数量. 思路是dp[i][j]表示已经有i个不相交集合下一个不相交集合的最右边界. 离散化后,通过贪心解. 1 /* 4343 */ 2 #include <iostream&g ...
- 【HDOJ】4579 Random Walk
1. 题目描述 一个人沿着一条长度为n个链行走,给出了每秒钟由i到j的概率($i,j \in [1,n]$).求从1开始走到n个时间的期望. 2. 基本思路 显然是个DP.公式推导也相当容易.不妨设$ ...
- AC自动机 HDOJ 5384 Danganronpa
题目传送门 1 /* 2 题意:多个文本串,多个模式串在每个文本串出现的次数 3 AC自动机:这就是一道模板题,杭电有道类似的题目 4 */ 5 /************************** ...
- 构造 HDOJ 5400 Arithmetic Sequence
题目传送门 题意:问有多少个区间,其中存在j使得ai + d1 == ai+1(i<j) && ai + d2 == ai+1 (i>j) 构造:用c1[i], c2[i] ...
- Kruskal HDOJ 1233 还是畅通工程
题目传送门 1 /* 2 最小生成树之kruskal算法--并查集(数据结构)实现 3 建立一个结构体,记录两点和它们的距离,依照距离升序排序 4 不连通就累加距离,即为最小生成树的长度 5 */ 6 ...
最新文章
- CPU上跑到 100 fps 的高精度PyTorch人脸特征点检测库
- Tesseract——OCR图像识别 入门篇
- link 和 @import 的区别
- SAP gateway的307重定向
- 雨棚板弹性法计算简图_钢结构工程量计算、报价要点
- nginx 反向代理 502 错误的解决
- c#调用c++ delegate callback
- Nginx学习总结(11)——提高Nginx服务器的安全性,稳定性和性能的12种技巧
- Java高手需要注意的25个学习目标
- 【unity】解决 2d-extras 的 CustomRuleTileMenu 脚本报错的问题
- 拦截器(Interceptor)和过滤器(Filter)的区别
- html头部打开页面为兼容模式,Web页面因为兼容模式产生的奇怪问题解答
- EQMX+Nginx集群搭建
- 如何解决未能初始化战场服务器,microsoft net framework配置系统未能初始化
- linux开启远程ssh服务器配置,配置Linux服务器SSH远程密钥登录
- 腾讯云 DDNS 方案
- PSO算法求解全局最大值
- 计算机科学和物理哪个难,据说这是期末考试难度最大的15个专业,你上榜了吗?...
- MathType在word中的安装使用方法(要配合microsoft公式3.0才能使用)(ps:弄得不好可能造成word中Ctrl+V失灵)
- java定义文章的难度系数