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

C語言經典練習:求和序列與數組過濾問題詳解

     編輯:程式設計疑難解答

前言

C語言作為程式設計入門的基石,其指標操作、陣列處理與迴圈邏輯是每位開發者必須攻克的關鍵。本文將深入剖析兩道經典的C語言面試/作業題目:一是計算特定數列的最大項數,二是刪除陣列中包含特定數字的元素。透過詳細的程式碼講解與邏輯拆解,幫助你掌握核心解題思路。

問題一:求滿足條件的最大 n 值

題目描述

編寫函數 int fun(int m),計算並返回滿足以下表達式的最大整數 n:

1 + (1+2) + (1+2+3) + ... + (1+2+...+n) <= m

例如:當 m = 10000 時,程式應輸出 n = 38。

核心邏輯分析

這是一個雙重累加的問題。外層迴圈累加每一項的和,內層計算當前項 (1+2+...+i) 的值。當總和超過 m 時停止,返回上一輪的 i 值。

參考實現

int fun(int m) {
    int sum = 0; // 總和累加器
    int i = 1;
    while (1) {
        int term = 0; // 當前項 (1+2+...+i)
        for (int j = 1; j <= i; j++) {
            term += j;
        }
        if (sum + term > m) {
            break; // 超過限制,跳出
        }
        sum += term;
        i++;
    }
    return i - 1; // 返回最後滿足條件的 n
}

優化提示: 內層迴圈可用等差數列求和公式 i*(i+1)/2 替代,時間複雜度從 O(n²) 降為 O(n)。

問題二:刪除陣列中包含數字 6 的元素

題目描述

編寫函數 void fun(int *x, int n),功能為:刪除長度為 n 的陣列 x 中所有包含數字 6 的元素,被刪除位置由後續元素前移填補,剩餘位置賦值為 -1。陣列元素均為正整數。

輸入範例:122 1461 6234 16 11 663 911 2671 381 6
輸出範例:122 11 911 381 -1 -1 -1 -1 -1 -1

解題關鍵:數字判斷與陣列原地修改

  1. 判斷是否包含 6: 將整數轉為字串,使用 strstr 查找字元 '6'。
  2. 原地刪除: 維護一個有效長度變數 m,遍歷陣列,若當前元素含 6,則用陣列末尾的有效元素覆蓋當前位置,並將末尾標記為 -1,有效長度 m 遞減。注意覆蓋後需重新檢查當前位置的新元素。

參考實現

#include <string.h>

void fun(int *x, int n) {
    char buf[20];
    int i = 0;
    int m = n; // 當前有效長度
    
    for (i = 0; i < m; i++) {
        sprintf(buf, "%d", x[i]);
        if (strstr(buf, "6") != NULL) {
            // 含有 6,需刪除
            x[i] = x[m - 1]; // 尾部元素前移
            x[m - 1] = -1;   // 尾部標記 -1
            m--;             // 有效長度減 1
            i--;             // 關鍵:指針回退,重新檢查換上來的元素
        }
    }
    // 將剩餘無效位置填 -1 (其實上面邏輯已處理,這裡為保險)
    for (; i < n; i++) {
        x[i] = -1;
    }
}

注意: 原最佳回答的邏輯較為繁瑣且有潛在 Bug(如 ptr 未聲明),上述代碼採用更經典的「雙指針/有效長度」思想,邏輯清晰且高效。

總結

兩道題目分別考察了數學建模與迴圈控制、字串處理與陣列原地操作。掌握「將數字轉字串判斷特徵」與「維護有效長度進行原地刪除」這兩個通用技巧,對解決大量 C 語言陣列處理問題極有幫助。

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