代碼示例
#include
int main() {
int f[100];
f[0] = 1; f[1] = 1;
for (int i = 2; i < 100; i++) f[i] = f[i-1] + f[i-2]; // 預生成
int m, n; scanf("%d %d", &m, &n);
if (m > n) { int t=m; m=n; n=t; }
int i = 0;
while (f[i] < m) i++; // 定位到第一個 >= m
for (; f[i] <= n && f[i] > 0; i++) { // 輸出區間內 (且未溢位)
printf("%d ", f[i]);
}
printf("\n");
return 0;
}
優缺點分析
- 優點:生成與查詢分離清晰;
while 定位起始點避免全陣列遍歷 (雖 N 小無影響)。
- 隱患:
f[i] > 0 判斷溢位不嚴謹 (溢位未定義行為不一定變負);建議生成階段記錄有效長度 len。
- 格式:末尾多一空格,嚴格 OJ 可能扣分,可用
first 旗標修正。
改進版
int len = 0;
for (int i = 2; i < 100; i++) {
f[i] = f[i-1] + f[i-2];
if (f[i] < 0) break;
len = i + 1;
}
int first = 1;
for (int i = 0; i < len; i++) {
if (f[i] >= m && f[i] <= n) {
if (!first) printf(" ");
printf("%d", f[i]);
first = 0;
}
}