編寫一個程序,輸入一個浮點數和輸出格式要求,按照格式要求將該浮點數輸出。給定非負整數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代碼:
1 #include <iostream>
2 #include <sstream>
3 #include <iomanip>
4 #include <string>
5 using namespace std;
6
7 int main(void)
8 {
9 int m, n;
10 double num;
11
12 while (cin >> m >> n >> num)
13 {
14 if (m == 0 && n == 0)
15 cout << 0 << endl;
16 else
17 {
18 cout << setw(m) << setfill('0') << int(num);
19 if (n != 0)
20 {
21 ostringstream os;
22 os << setiosflags(ios_base::fixed);
23 os << fixed << setprecision(n+1) << num - int(num);
24 os << setiosflags(ios_base::fixed);
25 string str = os.str();
26 for (int i = 1; i <= n+1; i++)
27 cout << str[i];
28 }
29 cout << endl;
30 }
31 }
32
33 return 0;
34 }
這題其實是很磨砺人的題,因為題目裡有意無意地挖了幾個坑給我們(顯然是有意的,測試數據表明了這一點。)
大概要注意這幾點:
1、整數部分和小數部分的寬度格式控制一定要分開討論,而不能籠統的用 setw(m+n) 支持限制整個數字的寬度。因為這樣的控制不夠精確,也就是存在這樣的情況:當整數部分的寬度足夠而小數部分的寬度不夠時,小時部分可能找整數部分借了本不該屬於自己的“寬度”。
2、利用 sstream 對把小數部分轉換成字符串處理,避免輸出小數點前面的0。
3、由於小數部分不是四捨五入的(從樣例可以得知),所以這裡用了一個小技巧,即每次多捨入一位(n+1),這樣捨入情況不會影響到我們需要輸出的最後一位小數,而輸出字符串的時候輸出到指定寬度n即可。