C++利用IO流对浮点数进行格式化控制输出
2015-06-16 23:22
357 查看
浮点数输出
(100/100 分数)题目描述
编写一个程序,输入一个浮点数和输出格式要求,按照格式要求将该浮点数输出。给定非负整数m和n,表示输出的浮点数小数点前的宽度为m,若宽度不够则在前面补0,小数点后的宽度为n,若宽度不够则在后面补0(补充说明:当n=0时,只需输出整数部分,当m,n都为0时,则输出0)。
输入描述
每个测例共2行,第一行为两个整数m,n(n >= 0, m >= 0),第二行为一个浮点数。
输出描述
对每个测例输出的浮点数占一行,其小数点前宽度为m,小数点后宽度为n,不足时补零。
样例输入
5 3 12.3456789 2 10 12.34
样例输出
00012.345 12.3400000000
AC代码:
#include <iostream> #include <sstream> #include <iomanip> #include <string> using namespace std; int main(void) { int m, n; double num; while (cin >> m >> n >> num) { if (m == 0 && n == 0) cout << 0 << endl; else { cout << setw(m) << setfill('0') << int(num); if (n != 0) { ostringstream os; os << setiosflags(ios_base::fixed); os << fixed << setprecision(n+1) << num - int(num); os << setiosflags(ios_base::fixed); string str = os.str(); for (int i = 1; i <= n+1; i++) cout << str[i]; } cout << endl; } } return 0; }
这题其实是很磨砺人的题,因为题目里有意无意地挖了几个坑给我们(显然是有意的,测试数据表明了这一点。)
大概要注意这几点:
1、整数部分和小数部分的宽度格式控制一定要分开讨论,而不能笼统的用 setw(m+n) 支持限制整个数字的宽度。因为这样的控制不够精确,也就是存在这样的情况:当整数部分的宽度足够而小数部分的宽度不够时,小时部分可能找整数部分借了本不该属于自己的“宽度”。
2、利用 sstream 对把小数部分转换成字符串处理,避免输出小数点前面的0。
3、由于小数部分不是四舍五入的(从样例可以得知),所以这里用了一个小技巧,即每次多舍入一位(n+1),这样舍入情况不会影响到我们需要输出的最后一位小数,而输出字符串的时候输出到指定宽度n即可。
相关文章推荐
- C++头文件预编译与命名空间使用方法
- 【学习笔记】【C语言】进制
- ID3算法 决策树 C++实现
- C++标准库学习笔记(Shared Pointer)-3
- eclipse安装C/C++插件cdt
- Effective C++条款05解读: 了解C++默默编写并调用哪些函数
- 求众数(c语言)
- C语言-判断闰年
- C++中static、const、static const修饰变量作用详解(转)
- PCA人脸识别学习及C语言实现
- [C/CPP系列知识] Type difference of character literals 和 bool in C and C++
- C++中重载/覆盖/隐藏的区别
- C语言笔记之指针的初步认识
- C++下高效率int转成string
- 开始学习C++心得实例(4)
- c++异常处理机制
- 【leetcode c++】19 removeNthFromEnd
- c++容器之vector
- [C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++
- C++ Virtual介绍