大数和之添加了小数问题
2016-04-21 14:41
302 查看
杭电1753 大明A+B
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.9
1.1111111111 2.3444323343
1 1.1
Sample Output
4
3.4555434454
2.1
1;一个大数问题,应该是比较简单的大数问题,然而我被搞了好久,太坑了,也主要是自己,没有细心吧,好多细节之前都没考虑到,只有wa后才去检查出来的。
2;说一下这题要注意的方面吧,
第一;小数点前面的数和后面的数相加的方法是不同的。这里要注意。
第二点;就是要注意输出的时候,小数点后的后置0是不输出的,
第三;就是小数点后的第一位进位是进到小数点前一位上的,要记得考虑;
3,这题细节就这么多,我主要花在打代码和修改上面去得多点点。记得打代码的时候一定要细心,
感觉自己有好多次变量乱用了,数组下标乱用了,特别 要注意。
4;哦,还有就是记得要初始化了;
摆代码吧;
#include<stdio.h> #include<string.h> int main() { int sza[505], szb[505], xsa[505], xsb[505], szh[505], xsh[505]; int lensa, lensb, max, i, j, k, l, la, lb, lena, lenb,ll,flag; char a[505], b[505]; while(scanf("%s",a) != EOF){ scanf("%s",b); memset(sza, 0, sizeof(sza)); memset(szb, 0, sizeof(szb)); memset(xsa, 0, sizeof(xsa)); memset(xsb, 0, sizeof(xsb)); lena = strlen(a); lenb = strlen(b); for(i = 0; i < lena; i++){ if(a[i] == '.') break; sza[i] = a[i]-'0'; lensa = i; } la = 0; for(i++; i < lena; i++){ xsa[la] = a[i]-'0'; la++; } for(i = 0; i < lenb; i++){ if(b[i] == '.') break; szb[i] = b[i]-'0'; lensb = i; } lb = 0; for(i++; i < lenb; i++){ xsb[lb] = b[i]-'0'; lb++; } //////////求小数部分的和 max = la; if(lb > la){ max = lb; } l = 0; k = 0; flag = 0; for(i = max-1; i != -1; i--){ xsh[l] = xsa[i]+xsb[i]+k; k = xsh[l]/10; xsh[l] = xsh[l]%10; if(xsh[l] == 0){ flag++; } l++; } //////小数部分和打求出来了,留下了进位k; ll = 0; if(lensa >= lensb){ for(i = lensa,j =lensb; j != -1; i--,j--){ szh[ll] = sza[i]+szb[j]+k; k = szh[ll]/10; szh[ll] = szh[ll]%10; ll++; } for( ; i != -1; i--){ szh[ll] = sza[i]+k; k = szh[ll]/10; szh[ll] = szh[ll]%10; ll++; } if(k!=0){ szh[ll] = k; ll++; } } else{ for(i = lensb,j =lensa; j != -1; i--,j--){ szh[ll] = szb[i]+sza[j]+k; k = szh[ll]/10; szh[ll] = szh[ll]%10; ll++; } for( ; i != -1; i--){ szh[ll] = szb[i]+k; k = szh[ll]/10; szh[ll] = szh[ll]%10; ll++; } if(k!=0){ szh[ll] = k; ll++; } } ///// for(ll--; ll != -1; ll--){ printf("%d",szh[ll]); } if(flag == max){ printf("\n"); continue; } printf("."); for(i = 0; i <= l-1; i++){ if(xsh[i] != 0){ break; } } for(l--; l != i-1; l--){ printf("%d",xsh[l]); } printf("\n"); } return 0 ; }
相关文章推荐
- leetcode12.IntegerToRoman&&RomanToInteger
- java 路径(相对路径和绝对路径)问题汇总【转】
- 博客精华帖汇总与导读索引
- jQuery使用伪递归重复执行动画
- hibernate--session的CRUD方法, delete, load,get,update,saveorupdate, clear, flush
- 4537: [Hnoi2016]最小公倍数
- poj 1860 Currency Exchange
- 中国最热门论坛-2011-11-[转]
- dapper查询demo、
- 横向长方形ProgressBar
- socket与文件描述符
- SpringMVC @RequestBody接收Json对象字符串--http://www.cnblogs.com/quanyongan/archive/2013/04/16/3024741.html
- oracle和sql server取第一条记录的区别以及rownum详解
- JS四舍五入方法
- Roll to roll architecture
- ABAP中FIELD-SYMBOLS的详细用法
- Linux Shell脚本编程--cut命令
- chrome插件——Vimium 键盘手福利
- 【dubbo学习】5.dubbo admin管理控制台启动
- 在centos中搭建基于smart http的git server