編寫一個程序,輸入一個浮點數和輸出格式要求,按照格式要求將該浮點數輸出。給定非負整數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即可。