C 語言作為程式設計的基石,其經典範例涵蓋了陣列、迴圈、遞迴、指標、結構體等核心概念。本文精選自「C 語言程式設計經典 100 例」的前 30 題,並附上詳細的邏輯分析與標準程式碼,適合初學者鞏固語法、訓練邏輯思維,也可作為面試複習的參考資料。
題目:用 1、2、3、4 四個數字,組成互不相同且無重複數字的三位數,共能組成多少個?列出所有組合。
分析:百位、十位、個位各有 4 種選擇,用三層巢狀迴窮舉所有排列,再以 if (i!=j && i!=k && j!=k) 過濾重複數字。
關鍵點:巢狀 for 迴圈、條件判斷、排列組合邏輯。
題目:根據利潤 I 計算獎金,分段提成比例:≤10 萬 10%,10-20 萬 7.5%,20-40 萬 5%,40-60 萬 3%,60-100 萬 1.5%,>100 萬 1%。
分析:利用「數軸分界」思維,預先計算各區間臨界點的累積獎金(bonus1 到 bonus10),再根據輸入利潤落入的區間,套用對應公式計算。注意變數需用 long int 防止溢位。
關鍵點:if-else if 多重條件、分段函數處理、長整型應用。
題目:一個整數加 100 後是完全平方數,再加 168(共加 268)也是完全平方數,求該數。
分析:在 10 萬內暴力搜尋。判斷完全平方數的技巧:x = sqrt(n); if (x*x == n)。需包含 math.h 並連結數學庫(編譯時加 -lm)。
關鍵點:sqrt() 函數、整數平方判斷、暴力搜尋優化。
題目:輸入年月日,輸出是當年的第幾天。
分析:用 switch 累加前幾月天數,再加上當月日數。閏年判斷條件:(year%400==0) || (year%4==0 && year%100!=0)。若為閏年且月份 > 2,總天數 +1。
關鍵點:switch-case、閏年算法、邊界條件處理。
題目:輸入三個整數,由小到大輸出。
分析:兩兩比較交換,先確保 x 最小,再確保 y ≤ z。邏輯清晰,適合初學者理解排序本質。
關鍵點:變數交換技巧(暫存變數)、多重 if 判斷。
題目:用 * 輸出字母 C 圖案。
分析:直接用多行 printf 列印固定圖案,練習跳脫字元 \n 與空格對齊。
題目:利用 ASCII 碼 176、219 輸出特殊圖案。
分析:char a=176, b=219; 對應不同區塊字元,透過 %c 格式化輸出 5x5 矩陣。展示字元編碼與視覺化關係。
題目:輸出 9x9 乘法口訣表。
分析:外層迴圈控制行 (i=1..9),內層控制列 (j=1..9)。%-3d 實現左對齊佔 3 寬,輸出整齊。
關鍵點:雙重 for 迴圈、格式化輸出 %-3d、換行控制。
題目:輸出 8x8 棋盤圖案。
分析:利用 (i+j)%2==0 判斷黑白格,219 為實心區塊字元,否則輸出空格。展示座標幾何與奇偶性的程式轉化。
題目:列印樓梯圖案,頂端顯示兩個笑臉。
分析:\1 為笑臉字元(IBM PC 字元集)。外層迴圈控制行數,內層根據行號印製對應數量的方塊。
題目:一對兔子從第 3 個月開始每月生一對,小兔第 3 個月也開始生,求每月總數。
分析:經典費波那契數列 1,1,2,3,5,8... 用 f1, f2 兩變數滾動更新:f1=f1+f2; f2=f1+f2; 每次產生兩項,每行輸出 4 個。
關鍵點:遞迴關係的迭代實現、變數滾動更新技巧。
題目:判斷 101-200 間有多少質數並列出。
分析:質數判定:試除法至 sqrt(n)。用 leap 旗標標記是否為質數,計數器 h 統計總數,每 10 個換行。
關鍵點:試除法優化(至平方根)、旗標變數應用、格式化輸出。
題目:找出所有三位數,其各位數字立方和等於本身(如 153=1³+5³+3³)。
分析:遍歷 100-999,用除法取百位 n/100、十位 n/10%10、個位 n%10,驗證立方和條件。
關鍵點:位數分解技巧、數學屬性驗證。
題目:將正整數分解質因數,如 90=2*3*3*5。
分析:從最小質數 2 開始試除,能整除則輸出並更新 n=n/i,否則 i++。迴圈條件 i<=n 確保分解完全。
關鍵點:for 迴圈搭配 while、質因數分解算法。
題目:≥90 分 A,60-89 分 B,<60 分 C。
分析:三元運算子巢狀:grade = score>=90 ? 'A' : (score>=60 ? 'B' : 'C');。簡潔實現多條件分支。
關鍵點:三元運算子 ?: 巢狀用法、條件判斷簡化。
題目:輸入兩正整數,求最大公約數 (GCD) 與最小公倍數 (LCM)。
分析:輾轉相除法(歐幾里得算法):while(b!=0){ temp=a%b; a=b; b=temp; } 最後 a 為 GCD。LCM = 兩數乘積 / GCD。
關鍵點:歐幾里得算法、GCD 與 LCM 數學關係。
題目:輸入一行字元,統計各類字元個數。
分析:while((c=getchar())!='\n') 逐字讀取,用 if-else if 依序判斷字母、空格、數字、其他,對應計數器遞增。
關鍵點:getchar() 迴圈、字元分類判斷 (ASCII 範圍)。
題目:計算 s = a + aa + aaa + ... (n 項),a 為單一數字。
分析:關鍵在項值生成:tn = tn + a; sn = sn + tn; a = a * 10;。每項在前項基礎上 *10 + a,累加至總和。
關鍵點:數列規律發現、長整型防溢位、迴圈累加邏輯。
題目:找出 1000 內所有完數(因子和等於自身,如 6=1+2+3)。
分析:雙重迴圈,外層遍歷 2-999,內層累加真因子。用陣列 k[] 記錄因子以便輸出。若因子和 s==0 則為完數。
關鍵點:因子遍歷、陣列輔助輸出、完數數學定義。
題目:球從 100m 落下,每次反彈高度減半,求第 10 次落地總路程與第 10 次反彈高度。
分析:初始 sn=100, hn=50。迴圈 n=2..10:sn += 2*hn; hn /= 2;。注意第一次只落下 100m,之後每次落地包含上彈與下落。
關鍵點:物理模型程式化、浮點數運算、迴圈邊界處理。
題目:猴子每天吃剩餘一半再多吃一個,第 10 天剩 1 個,求第一天摘了多少。
分析:逆向推導:第 n-1 天桃數 = (第 n 天桃數 + 1) * 2。從第 9 天反推至第 1 天。
關鍵點:逆向遞迴思維、while 迴圈倒推。
題目:甲隊 a,b,c vs 乙隊 x,y,z,a 不和 x 比,c 不和 x,z 比,求對賽名單。
分析:三層迴圈窮舉 i,j,k 為 a,b,c 的對手,條件:i!=j && i!=k && j!=k(一一對應),再加限制 i!='x' && k!='x' && k!='z'。
關鍵點:全排列生成、多條件約束篩選、字元變數應用。
題目:列印 7 行菱形(* 為中心對稱)。
分析:拆為上半部 (4 行) 與下半部 (3 行)。上部:空格遞減、星號遞增;下部:空格遞增、星號遞減。雙重迴圈分別控制空格與星號數量。
關鍵點:圖案幾何規律數學化、雙重迴圈獨立控制列印內容。
題目:前 20 項和。數列規律:分子 = 前項分子+分母,分母 = 前項分子。
分析:用暫存變數 t=a; a=a+b; b=t; 實現分子分母同步更新,迴圈累加 s += a/b。
關鍵點:斐波那契數列變體、變數交換技巧在數列中的應用、浮點累加精度。
題目:計算 1! + 2! + ... + 20! 的和。
分析:單迴圈維護 t 為當前階乘值 (t *= n),s 累加 (s += t)。用 float 或 double 儲存大數,%e 科學記號輸出。
關鍵點:迭代計算階乘避免重複運算、大數處理與科學記號輸出。
題目:用遞迴函數求 0! 到 4!。
分析:遞迴定義:fact(0)=1; fact(n)=n*fact(n-1)。主程式迴圈呼叫 fact(i)。展示遞迴基準情況與遞迴步驟。
關鍵點:遞迴函數設計、基準情況、函數原型宣告。
題目:輸入 5 個字元,用遞迴反序輸出。
分析:遞迴函數 palin(n):若 n<=1 讀取並列印;否則讀取一字元,遞迴呼叫 palin(n-1),返回後列印該字元。利用呼叫堆疊的後進先出 (LIFO) 特性實現反轉。
關鍵點:遞迴與堆疊關係、getchar()/putchar() 字元 I/O、遞迴回溯時機。
題目:5 人同坐,第 5 人比第 4 人大 2 歲... 第 1 人 10 歲,求第 5 人年齡。
分析:遞迴函數 age(n):if(n==1) return 10; else return age(n-1)+2;。從已知基點層層回推。
關鍵點:線性遞迴、數學歸納法的程式實現。
題目:輸入 ≤5 位正整數,輸出位數並逆序列印各位數字。
分析:用除法與取餘分解萬、千、百、十、個位。再用 if-else if 由高位向低位判斷實際位數,按逆序輸出。
關鍵點:整數分解位數技巧、多重條件判斷位數、格式化輸出控制。
題目:判斷五位數是否為迴文數(個位=萬位,十位=千位)。
分析:同例 29 分解位數,直接比較 ge==wan && shi==qian。簡單高效的對稱性檢查。
關鍵點:位數提取、對稱條件判斷、布林邏輯簡化。
這 30 道經典題目涵蓋了 C 語言入門的核心知識點:
if-else、switch、for/while 巢狀迴圈建議初學者:
掌握這些經典範例,不僅能熟練 C 語法,更能養成「將問題拆解為電腦可執行步驟」的程式設計思維——這正是從寫代碼到做工程的關鍵跨越。