首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言練習:用戶輸入 n 的階乘交替級數求和 1! - 2! + ... + n! (含溢出防護)

     編輯:關於C語言

問題描述

擴展前題:接收用戶輸入的 n,計算 f = 1! - 2! + 3! - ... + n!。引入運行時輸入與溢出風險提示,更具實用性。

完整實現:交互式輸入版

#include <stdio.h>

void f(int m);

int main() {
    int n;
    printf("請輸入一個數(不能太大): ");
    scanf("%d", &n);
    f(n);
    return 0;
}

void f(int m) {
    int i, j;
    int k = 1;
    int s = 1;
    int sum = 0;

    for (i = 1; i <= m; i++) {
        s = 1;
        for (j = 1; j <= i; j++) {
            s *= j;
        }
        sum += s * k;
        k = -k;
    }
    printf("%d\n", sum);
}

關鍵改進點與工程化建議

1. 輸入驗證與溢出防護(必加)


void f_safe(int m) {
    if (m > 12) {  // 13! 溢出 32 位 int
        printf("警告: n > 12 會導致 int 溢出,建議用 long long\n");
        // 可選:自動切換 long long 邏輯
    }
    long long fact = 1, sum = 0;
    int sign = 1;
    for (int i = 1; i <= m; i++) {
        fact *= i;
        sum += fact * sign;
        sign = -sign;
    }
    printf("結果 (long long): %lld\n", sum);
}

2. 掃描返回值檢查


if (scanf("%d", &n) != 1) {
    printf("輸入無效,請輸入整數\n");
    return 1;
}

3. 緩衝區清理

scanf 留下換行符可能影響後續輸入,建議加 while(getchar() != '\n'); 清理。

遞推優化版(O(n) 替代 O(n²))


void f_optimized(int m) {
    long long fact = 1, sum = 0;
    int sign = 1;
    for (int i = 1; i <= m; i++) {
        fact *= i;           // 遞推計算階乘
        sum += fact * sign;
        sign = -sign;
    }
    printf("優化版結果: %lld\n", sum);
}

溢出邊界對照表

類型最大安全 n最大值位數
int (32位)122,147,483,64710位
long long (64位)209,223,372,036,854,775,80719位
double (近似)170~1e308308位

總結

交互式階乘級數求和將「固定 n」升級為「通用計算器」,引入了輸入驗證、類型選擇、算法優化等工程關鍵點。建議學習者:

  1. 嘗試 n=13 觀察 int 溢出現象(負數或錯誤值);
  2. 實現 long long 版本支持到 n=20;
  3. 挑戰:用字串/陣列模擬大整數,突破 n=20 限制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved