NOJ - T013
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】NOJ 和 C 程序設計習題
[
17 瀏覽
0 評論
4 贊
4 踩
]
概要
級數和
正文
#include <stdio.h> #include <math.h> // 獲得小數 double ToDecimal(int dec) { double ret = dec; for (int i = dec; i != 0; i /= 10) { ret /= 10.0; } return ret; } // 獲取浮點數的小數位數 int GetDecimalScale(double dec) { dec -= (int)dec; // 只保留小數部分 for (int i = 0;; dec *= 10, dec -= (int)dec, i++) { if (fabs(dec) < 1e-5) return i; } return -1; // 未知情況 } // 輸出小數(防止多餘的 0 輸出) void PrintDecimal(double dec) { printf("%.*lf", GetDecimalScale(dec), dec); } // 修剪小數末尾的 0 int TripDecimalZero(int dec) { for (; dec % 10 == 0; dec /= 10); return dec; } int main() { int n = 0; scanf("%d", &n); double lfAns = 0; for (int i = 1; i <= n; i++) { int nInteger = i; // 整數部分 // 小數部分 // 對於 9.10 其實應該寫成 9.1,因此需要修剪 0 int nDecimal = TripDecimalZero(i + 1); double lfDecimal = ToDecimal(nDecimal); lfAns += nInteger + lfDecimal; printf("%d.%d%c", nInteger, nDecimal, i == n ? '=' : '+'); } lfAns += 1e-10; // 避免浮點數不精確導致 0.60 變成 0.599999... 情況使得浮點數位數計算失誤 PrintDecimal(lfAns); return 0; }