HDU1753 大明A+B【大数】
大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14058 Accepted Submission(s): 5147
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
问题链接:HDU1753 大明A+B。
问题简述:参见上文。
问题分析:
两个数可以能非常长,带有小数点,所以相加的话要么直接相加,要么转换为大数。大数的话,因为有小数点,就不那么好算了。所以还是直接相加。
程序说明:
直接相加也有两种计算方法,一种是把两个数读到字符串数组中,然后对齐小数点并且补0,再行相加;另外一种方法(本程序使用的方法)是直接计算位置,进行相加。
读入数据时也有两种方法,一是用函数scanf()读入数据(字符串);二是使用函数getchar()读入数据(逐个字符读入)。由于进行相加时,需要计算小数点前后的位数,后一种可以一边读入数据一边计算。本程序采用后一种做法,逻辑上稍微复杂一些,需要更高的技巧。
程序中,需要注意两点:
1.计算结果的整数部分左边有可能有很多0;
2.输入的最后一行,有可能没有换行("\n")文件就直接结束了,需要做特殊处理。
AC的C语言程序如下:
/* HDU1753 大明A+B */#include <stdio.h>
#include <stdlib.h>#define MAXN 400char a[MAXN+1], b[MAXN+1], ans[MAXN+1];int main(void)
{char c;int aleftcount, arightcount, bleftcount, brightcount, carry, count, i, j, k, l;for(;;) {c=getchar();if(c == EOF)break;// step1 读入Ai = 0;aleftcount = 0;arightcount = 0;// setp1.1 读入A的小数点前的各位,并且位数计数while(c != '.' && c != ' ') {a[i++] = c;aleftcount++;c=getchar();}a[i++] = c; // 小数点或空格// step1.2 读入A的小数点后的各位,并且位数计数if(c != ' ')while((c=getchar()) != ' ') {a[i++] = c;arightcount++;}k = i - 1;// step2 读入Bi = 0;bleftcount = 0;brightcount = 0;// setp2.1 读入B的小数点前的各位,并且位数计数while((c=getchar()) != '.' && c != '\n') {b[i++] = c;bleftcount++;}b[i++] = c; // 小数点或换行符// step2.2 读入B的小数点后的各位,并且位数计数if(c != '\n' && c != EOF)while((c=getchar()) != '\n' && c != EOF) {b[i++] = c;brightcount++;}l = i - 1;// step3 计算A+B// step3.1 小数部分相加j = 0;// step3.1.1 拷贝长的部分if(arightcount > brightcount) {count = arightcount - brightcount;while(count--)ans[j++] = a[k--];} else if(arightcount < brightcount) {count = brightcount - arightcount;while(count--)ans[j++] = b[l--];}// step3.1.2 同长部分相加carry = 0;count = (arightcount > brightcount) ? brightcount : arightcount;for(i=1; i<=count; i++) {ans[j] = carry + a[k] + b[l] - '0';if(ans[j] > '9') {ans[j] -= 10;carry = 1;} elsecarry = 0;j++;k--;l--;}// step3.2 小数点ans[j++] = '.';// step3.3 整数部分相加k--;l--;while(k >= 0 || l >= 0) {ans[j] = carry + ((k>=0) ? a[k] : '0') + ((l>=0) ? b[l] : '0') - '0';if(ans[j] > '9') {ans[j] -= 10;carry = 1;} elsecarry = 0;j++;k--;l--;}if(carry == 1)ans[j++] = '1';// step4 输出结果// step4.1 去掉右边的0和小数点k = 0;while(ans[k] == '0')k++;if(ans[k] == '.')k++;// step4.2 输出结果for(i=j-1; i>=k; i--)putchar(ans[i]);putchar('\n');}return 0;
}
HDU1753 大明A+B【大数】相关推荐
- HDU1753 大明A+B
问题链接:HDU1753 大明A+B.基础训练级的题,用C语言编写程序. 问题简述:参见上述链接. 问题分析:两个数可以能非常长,带有小数点,所以相加的话要么直接相加,要么转换为大数.大数的话,因为有 ...
- HDU1753 大明A+B(大数相加)(Java题解)
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- hdu1753大明A+B
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU1753—大明A+B(大正小数相加)
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- java大数输出一位小数_java大数练习 大明A+B(大数小数的高精度)
title: java大数练习 大明A+B(大数小数的高精度) tags: [acm,杭电,大数] 题意 Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他 ...
- 题目梳理(一)(2019.07.06~2019.07.20)
一.字典树类型 A HihoCoder1014 Trie树(已做) 题目链接 https://hihocoder.com/problemset/problem/1014 B HDU12 ...
- CCF认证训练行动路线图
通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...
- 《程序设计技术》课程辅助学习资料
本文档提供课程相关的辅助学习资料. 阅读程序是提高程序设计水平的最为有效的方法,<程序设计技术>课程至少应该阅读后面提供链接博文中的基础部分.能够阅读完基础部分的博文,则可以给课程学习奠定 ...
- 杭电 OJ 提交代码需要注意的问题
杭电acm 提交代码需要注意的问题 1. 用 Java 的时候类名请用 Main 2. Java 提交出现 PE 的可能原因有 1) 最基本的错误是空格问题,比如注意每行的末尾是否输出空格 2) 用 ...
最新文章
- 神奇的 SQL,Group By 真扎心,原来是这样!
- R语言可视化绘图基础知识详解
- python使用for循环打印99乘法表-Python用for循环实现九九乘法表
- 如何把你的Windows PC变成瘦客户机
- 图像的连通域检测的堆栈算法
- C#配置及使用log4net
- Product 1 Modulo N CodeForces - 1514C
- byte转换为string乱码_每日一课 | 如何将int转换为String
- 太神奇!波士顿动力机器狗即将长出手臂,还能自己跑去充电
- wpf label字体为斜体_快来收下这份字体设计必备知识点
- 数据库的驱动配置文件
- 烹佛烹祖大炉鞴,锻凡锻圣恶钳锤
- PythonServer
- 运动控制器之追剪应用Demo
- WAP在线浏览器大全
- 对接谷歌翻译接口的WordPressSEO插件
- office图标异常处理
- Mapped Statements collection already contains value
- DolphinScheduler征稿 —手把手教你如何使用小豚调度
- 如何修改桌面的存放路径?(将桌面放到D盘或E盘)