匯東網


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;
}


[ 4] [ 4]


 評論區  0 條評論

+ 添加評論