思路:單次遍歷,維護 max/min 及對應下標 max_idx/min_idx。
#include <stdio.h>
int main(void) {
int a[5], i, max, min, max_idx = 0, min_idx = 0;
printf("輸入 5 個整數: ");
for (i = 0; i < 5; i++) scanf("%d", &a[i]);
max = min = a[0];
for (i = 1; i < 5; i++) {
if (a[i] > max) { max = a[i]; max_idx = i; }
if (a[i] < min) { min = a[i]; min_idx = i; }
}
printf("最大值 %d 下標 %d | 最小值 %d 下標 %d\n", max, max_idx, min, min_idx);
return 0;
}
注意:C 語言下標從 0 開始,「偶數行/列」對應下標 0、2(即第 1、3 行/列)。
#include <stdio.h>
int main(void) {
int a[4][4], i, j;
printf("輸入 16 個整數: ");
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
scanf("%d", &a[i][j]);
printf("偶行偶列元素: ");
for (i = 0; i < 4; i += 2) // 步長 2 直接跳過奇行
for (j = 0; j < 4; j += 2)
printf("%d ", a[i][j]);
putchar('\n');
return 0;
}
前提:數組已升序排列。時間複雜度 O(log n)。
#include <stdio.h>
#define N 10
int main(void) {
int a[N] = {-1, 6, 8, 10, 15, 20, 21, 25, 29, 55};
int target, low = 0, high = N - 1, mid, found = 0;
printf("輸入查找值: ");
scanf("%d", &target);
while (low <= high) {
mid = (low + high) / 2;
if (target == a[mid]) { found = 1; break; }
else if (target < a[mid]) high = mid - 1;
else low = mid + 1;
}
if (found) printf("找到 %d,下標 %d\n", target, mid);
else printf("不存在 %d\n", target);
return 0;
}
| 問題 | 模式 | 關鍵點 |
|---|---|---|
| 極值/統計 | 單遍歷累積器 | 初始化用首元素,同時記錄下標 |
| 二維篩選 | 雙重迴圈 + 步長/條件 | 下標從 0 起,「偶」對應 0,2,4… |
| 有序查找 | 二分收斂 | low <= high、mid = (low+high)/2、三向分支 |
mid = low + (high - low) / 2。std::lower_bound/upper_bound 封裝了邊界細節,生產代碼優先用標準庫。