首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

POJ 1002 C++ 輸出格式陷阱:cout 與 printf 的細微差異導致 WA

     編輯:程式設計綜合問答

現象複現

POJ 1002 電話號碼映射統計題,邏輯正確但 cout 版本 WA,printf 版本 AC。代碼片段:

// WA 版本
cout << fixed << setprecision(3) << it->first/10000 << "-" 
     << fixed << setprecision(4) << it->first%10000 << " " << it->second << endl;

// AC 版本
printf("%03d-%04d %d\n", it->first/10000, it->first%10000, it->second);

根因:格式化輸出不等價

  1. fixed + setprecision(3) 對整數 it->first/10000 無效,不會補前導零。輸出 123 而非 001。
  2. setprecision(4) 同理,4567 正常,但 7 輸出 7 而非 0007。
  3. printf("%03d-%04d") 強制 寬度補零,完全符合題目「3 位區號-4 位號碼」格式要求。

修正後的 cout 寫法

#include <iomanip>
cout << setfill('0') << setw(3) << it->first/10000 << "-"
     << setw(4) << it->first%10000 << " " << it->second << endl;
  • setfill('0') 指定填充字符
  • setw(N) 設定下一個輸出項最小寬度,不足補零
  • 每次輸出前需重新 setw,因其僅對下一次插入操作有效

避坑清單

  1. OJ 題目嚴格要求格式時,優先用 printf/format,可讀性與可控性更強。
  2. fixed/scientific 僅影響浮點數,整數格式化靠 setw/setfill。
  3. 大量輸出時 ios::sync_with_stdio(false); cin.tie(nullptr); 加速 cout,但格式控制仍繁瑣。
  4. C++20 std::format("{:03d}-{:04d} {}", a, b, c) 終結此類問題(需編譯器支援)。

教訓:輸出格式是 AC 的一部分,樣例輸出逐字符核對,邊界情況(如 0、最大值)自測驗證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved