浮点数加法 九度oj
来源:互联网 发布:人工智能的发展前景 编辑:程序博客网 时间:2024/05/18 00:43
题目
题目描述:求2个浮点数相加的和题目中输入输出中出现浮点数都有如下的形式:P1P2...Pi.Q1Q2...Qj对于整数部分,P1P2...Pi是一个非负整数对于小数部分,Qj不等于0输入:对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。每组测试数据之间有一个空行,每行数据不超过100个字符输出:每组案例是n行,每组测试数据有一行输出是相应的和。输出保证一定是一个小数部分不为0的浮点数样例输入:20.1111111111111111111111111111110.11111111111111111111111111111110000000.6555555555555555555555555555551.444444444444444444444444444445样例输出:0.22222222222222222222222222222210000002.1
思路
这道题本来考察的应该是大整数加法,但是太多细节需要注意了,我提示几点:
- 细心,分解整数部分和小数部分,分别相加,注意大整数加法的进位
- 注意一个测试用例,0.0+0.0应该=0.0
- 注意对整数部分开始0的截断,和小数部分最后0的截断
AC代码
#include <stdio.h>#include <string.h>#include <stdlib.h> #define LEN 101 int ia[LEN], fa[LEN], ib[LEN], fb[LEN], ic[LEN], fc[LEN]; int main(){ char str1[LEN], str2[LEN]; int i, j, k, n, l1, l2, lai, laf, lbi, lbf, temp, flmax, ilmax; while (scanf("%d", &n) != EOF) { while (n --) { // 初始化 memset(ia, 0, sizeof(ia)); memset(fa, 0, sizeof(fa)); memset(ib, 0, sizeof(ib)); memset(fb, 0, sizeof(fb)); memset(ic, 0, sizeof(ic)); memset(fc, 0, sizeof(fc)); // 接收第一个浮点数 scanf("%s", str1); l1 = strlen(str1); // 构建整数部分数组 for (i = 0; i < l1 && str1[i] != '.'; i ++) { ia[i] = str1[i] - '0'; } lai = i; // 数位替换 for (j = 0, k = lai - 1; j <= lai / 2 && j < k; j ++, k --) { temp = ia[j]; ia[j] = ia[k]; ia[k] = temp; } // 构建小数部分数组 for (i += 1; i < l1; i ++) { fa[i - 1 - lai] = str1[i] - '0'; } laf = i - 1 - lai; // 接收第二个浮点数 scanf("%s", str2); l2 = strlen(str2); // 构建整数部分数组 for (i = 0; i < l2 && str2[i] != '.'; i ++) { ib[i] = str2[i] - '0'; } lbi = i; // 数位替换 for (j = 0, k = lbi - 1; j <= lbi / 2 && j < k; j ++, k --) { temp = ib[j]; ib[j] = ib[k]; ib[k] = temp; } // 构建小数部分数组 for (i += 1; i < l2; i ++) { fb[i - 1 - lbi] = str2[i] - '0'; } lbf = i - 1 - lbi; // 谁的小数位数更多 flmax = (laf >= lbf) ? laf : lbf; int c = 0; //小数进位 for (i = 0, j = flmax - 1; j >= 0; j --, i ++) { fc[i] = fa[j] + fb[j] + c; if (fc[i] >= 10) { c = fc[i] / 10; fc[i] %= 10; }else { c = 0; } } // 整数相加 ilmax = (lai >= lbi) ? lai : lbi; for (i = 0; i < ilmax; i ++) { ic[i] = ia[i] + ib[i] + c; if (ic[i] >= 10) { c = ic[i] / 10; ic[i] %= 10; }else { c = 0; } } while (c) { ic[ilmax ++] = c % 10; c /= 10; } // 打印最后结果 // 找到第一个不为0的整数位 for (j = ilmax - 1; j >= 0; j --) { if (ic[j] != 0) { break; } } if (j >= 0) { for (i = j; i >= 0; i --) { printf("%d", ic[i]); } }else { printf("0"); } printf("."); // 找到最后一个不为0的小数位 for (j = 0; j < flmax - 1; j ++) { if (fc[j] != 0) { break; } } for (i = flmax - 1; i >= j; i --) { printf("%d", fc[i]); } printf("\n"); // 接收空行 getchar(); } } return 0;}/************************************************************** Problem: 1137 User: wangzhengyi Language: C Result: Accepted Time:290 ms Memory:912 kb****************************************************************/
- 九度OJ 1137 浮点数加法
- 浮点数加法 九度oj
- 九度OJ-1137-浮点数加法
- 九度OJ 题目1137:浮点数加法
- 九度OJ 1137:浮点数加法 (大数运算)
- 九度OJ-1137:浮点数加法
- 【九度OJ】题目1137:浮点数加法 解题报告
- 题目1137:浮点数加法 九度OJ
- 九度[1137]-浮点数加法
- //九度OJ 教程63 大数处理之浮点数加法
- OJ_1137 浮点数加法
- 大数浮点数加法
- 浮点数加法
- 浮点数加法
- 九度 OJ 1198 高精度加法
- 九度oj 题目1062:分段函数--浮点数判断是否等于0
- 浮点数的大数加法
- 题目63:浮点数加法
- BootChart 在 Android 中的应用
- mysql的union和union all
- Example4_9
- 转 导数
- c/c++ 得到一个文件或目录的信息
- 浮点数加法 九度oj
- js数组操作大全
- 汇总Delphi第三方控件—报表、图表、界面、数据库
- cocos2d-x android配置
- 五种控制Android应用的权限的方法
- 整理的C、C++面试题
- Android 歌词同步滚动效果
- 软件公司的两种管理方式
- 归并排序