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