当前位置:编程学习 > C/C++ >>

浮点数加法 九度oj

题目
[html] view plaincopy
题目描述:  
求2个浮点数相加的和  
题目中输入输出中出现浮点数都有如下的形式:  
P1P2...Pi.Q1Q2...Qj  
对于整数部分,P1P2...Pi是一个非负整数  
对于小数部分,Qj不等于0  
输入:  
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。  
每组测试数据之间有一个空行,每行数据不超过100个字符  
输出:  
每组案例是n行,每组测试数据有一行输出是相应的和。  
输出保证一定是一个小数部分不为0的浮点数  
样例输入:  
2  
0.111111111111111111111111111111  
0.111111111111111111111111111111  
  
10000000.655555555555555555555555555555  
1.444444444444444444444444444445  
样例输出:  
0.222222222222222222222222222222  
10000002.1  
 
思路
这道题本来考察的应该是大整数加法,但是太多细节需要注意了,我提示几点:
细心,分解整数部分和小数部分,分别相加,注意大整数加法的进位
注意一个测试用例,0.0+0.0应该=0.0
注意对整数部分开始0的截断,和小数部分最后0的截断
 
AC代码
[cpp]  
#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;  
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,