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

C語言數列求和:2+22+222+... 通項公式與循環累加修正

     編輯:C 語言問答

數列求和:項生成邏輯與輸出順序修正

數列規律

第 k 項:a_k = a_{k-1} * 10 + d (d=2),a_1 = d。
求前 n 項和 S_n。

原代碼邏輯錯誤

s = a;  // 錯誤:a 未初始化,且首項未加入
for (i = 1; i < b; i++) {
    a = a*10 + 2;
    s += a;  // 先生成下一項,再加 → 漏掉首項 2
}

修正版:首項先加,再生成下一項

#include <stdio.h>

int main() {
    int d, n;  // 數字 d, 項數 n
    printf("輸入數字 和 項數 (如 2 5 表示 2+22+222+2222+22222): ");
    scanf("%d %d", &d, &n);
    if (d < 0 || d > 9 || n <= 0) { printf("參數無效\n"); return 1; }

    long long sum = 0;
    long long term = 0;
    for (int i = 1; i <= n; ++i) {
        term = term * 10 + d;  // 先生成當前項
        sum += term;           // 再累加
        printf("第%d項: %lld\n", i, term);
    }
    printf("總和: %lld\n", sum);
    return 0;
}

通項公式 (O(1) 計算)

a_k = d * (10^k - 1) / 9 (等比級數和)。
S_n = d/9 * [ (10^{n+1} - 10)/9 - n ] = d * (10^{n+1} - 9n - 10) / 81。

long long sum_formula(int d, int n) {
    long long p10 = 1;
    for (int i = 0; i <= n; ++i) p10 *= 10;  // 10^{n+1}
    return d * (p10 - 9*n - 10) / 81;
}
// 注意:n 較大時 p10 溢出 long long (n>18),需用大整數或模運算

輸入參數化 (原追問)

支持任意數字 d (1-9) 和項數 n:
輸入 2 4 → 2+22+222+2222 = 2468
輸入 3 5 → 3+33+333+3333+33333 = 37035

避坑指南

  1. 累加順序:先生成項,再加入和 (或首項初始化 sum=term=d,循環從 2 開始)。
  2. 變量初始化:sum=0, term=0;s=a 其中 a 未初始化是嚴重錯誤。
  3. 溢出:項數 > 18 時 long long 溢出,需用字符串/大整數庫。
  4. 輸入格式:scanf("%d %d", &d, &n) 用空格分隔,比逗號更魯棒。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved