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

大一 C 語言經典練習題解析:篩法求質數、選擇排序、數組插入、函數聲明

     編輯:程式設計疑難解答

題目一:篩法求 100 以內質數 (埃拉托斯特尼篩)

原代碼邏輯

int a[101];
for(i=1;i<=100;i++) a[i]=i;
a[1]=0; // 1 不是質數
for(i=2;i

關鍵註釋

  • a[i]=0 標記合數,非零即質數。
  • 外層循環 i < sqrt(100) 即 i <= 10,因合數最小質因子不超過 √n。
  • 內層從 i+1 開始遍歷,非標準篩法 (標準從 i*i 步長 i),但對 n=100 正確。
  • 輸出每行 10 個,用計數器 n 控制換行。

題目二:選擇排序 (從小到大) — 原代碼 Bug 修正

Bug

輸入循環 for(i=0;i<=10;i++) 寫入 a[0]..a[10] (11 個),輸出循環 for(i=1;i<=10;i++) 讀取 a[1]..a[10],**丟失 a[0]**,且 a[10] 未初始化 (垃圾值)。

修正

// 輸入 10 個數存 a[0]..a[9]
for(i=0; i<10; i++) scanf("%d", &a[i]);

// 選擇排序:每輪選最小放前面
for(i=0; i<9; i++) {
    int minIdx = i;
    for(j=i+1; j<10; j++)
        if(a[j] < a[minIdx]) minIdx = j;
    if(minIdx != i) { int t=a[i]; a[i]=a[minIdx]; a[minIdx]=t; }
}

// 輸出 a[0]..a[9]
for(i=0; i<10; i++) printf("%d ", a[i]);

題目三:有序數組插入新元素保持有序

原代碼邏輯正確

  • 若 number > a[9] 直接放 a[10]。
  • 否則遍歷找到第一個 a[i] > number,將 a[i..9] 依次後移一位 (用 temp1 滾動交換),插入 number。
  • break 退出循環,避免重複移動。

優化寫法

int i = 9;
while (i >= 0 && a[i] > number) {
    a[i+1] = a[i];
    i--;
}
a[i+1] = number; // 插入位置

題目四:自定義 max 函數 — 缺少前置聲明

錯誤

c = max(a,b); 在 main 中調用,但 max 定義在 main 之後,C89 標準隱式聲明假設返回 int,若實際返回 int 碰巧能跑,但不規範。現代編譯器會警告 implicit declaration。

修正

// 方法一:函數原型聲明在 main 前
int max(int x, int y);

int main() { ... }

int max(int x, int y) { return x>y?x:y; }

// 方法二:直接把函數定義移到 main 前
int max(int x, int y) { return x>y?x:y; }
int main() { ... }

總結避坑指南

  1. 數組下標統一從 0 開始,長度 n 即 0..n-1。
  2. 排序/查找邊界條件仔細檢查 (< vs <=)。
  3. 函數必須**聲明在前**或**定義在前**,養成寫頭文件/原型習慣。
  4. 篩法外層到 sqrt(n),內層步長優化。但小數據量邏輯正確即可。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved