浮点数加法 九度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

思路

这道题本来考察的应该是大整数加法,但是太多细节需要注意了,我提示几点:
  1. 细心,分解整数部分和小数部分,分别相加,注意大整数加法的进位
  2. 注意一个测试用例,0.0+0.0应该=0.0
  3. 注意对整数部分开始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****************************************************************/


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 亲爱的我想你我怎么办 人在澳大利亚悉尼找不到了怎么办 红米手机忘记手势密码怎么办 捡到苹果手机怎么办才能自己用 日语会读不会写怎么办 手术后nbp过低怎么办 我的手破了怎么办英文 平板手机屏坏了怎么办 他很优秀我该怎么办 洗澡的花洒漏水怎么办 高三了文科成绩很差怎么办 骑缝章最后一页没盖全怎么办 机票取早了没有登机口怎么办 机票早订比晚订贵怎么办? 孩子考差了父母怎么办 保险公司不给业务员办退司怎么办 我不习惯没有你我怎么办 锁坏了打不开了怎么办 要上班老人生病无人照顾怎么办 苹果手机一直说英文怎么办 公司很抠门怎么办英文怎么说 过了截港时间怎么办 截关日期是假日怎么办 恒温阀冷水进水堵塞怎么办 缺氧液泵管道堵塞怎么办 货物包装大集装箱装不下怎么办 微信收藏的视频格式错误怎么办 乙方被刑拘房租未付清怎么办 房贷银行卡号弄错怎么办 社保卡号弄错了怎么办 社保名字写错了怎么办 档案和身份证年龄姓名不一样怎么办 档案年龄与身份证年龄不一样怎么办 户口本身份证和档案不一样怎么办 如果档案姓名与身份证不符怎么办 感冒吃了白参怎么办 吃辣的嗓子疼怎么办 美团客户更改地址怎么办 忘记steam的账户名称怎么办 重置手机忘了密码怎么办 sp下行短信费扣怎么办