複利增長公式:Pₙ = P₀ × (1 + r)ⁿ
13.0756 × 1.01ⁿ > 15 1.01ⁿ > 15 / 13.0756 ≈ 1.1471 n × ln(1.01) > ln(1.1471) n > ln(1.1471) / ln(1.01) ≈ 0.1372 / 0.00995 ≈ 13.79
即第 14 年結束時超過,年份 = 2005 + 14 = 2019 年
#include <stdio.h>
int main() {
double population = 13.0756; // 億
const double growth_rate = 1.01;
int year = 2005;
printf("年份\t人口(億)\t增長量(億)\n");
printf("----\t--------\t----------\n");
while (population <= 15.0) {
double increase = population * (growth_rate - 1.0);
population *= growth_rate;
year++;
printf("%d\t%.4f\t\t%.4f\n", year, population, increase);
}
printf("\n>>> %d 年中國人口超過 15 億 <<<\n", year);
return 0;
}
年份 人口(億) 增長量(億) ---- -------- ---------- 2006 13.2064 0.1308 2007 13.3384 0.1321 2008 13.4718 0.1334 2009 13.6065 0.1347 2010 13.7426 0.1361 2011 13.8800 0.1374 2012 14.0188 0.1388 2013 14.1590 0.1402 2014 14.3006 0.1416 2015 14.4436 0.1430 2016 14.5880 0.1444 2017 14.7339 0.1459 2018 14.8812 0.1473 2019 15.0301 0.1488 >>> 2019 年中國人口超過 15 億 <<<
#include <stdio.h>
#include <math.h>
int predict_year(double initial, double rate_percent, double target, int start_year) {
double current = initial;
double rate = 1.0 + rate_percent / 100.0;
int year = start_year;
while (current <= target) {
current *= rate;
year++;
}
return year;
}
int main() {
// 原題驗證
int year = predict_year(13.0756, 1.0, 15.0, 2005);
printf("基礎題目: %d 年突破 15 億\n", year);
// 擴展應用
printf("\n不同增長率下突破 15 億年份:\n");
for (double r = 0.5; r <= 2.0; r += 0.5) {
int y = predict_year(13.0756, r, 15.0, 2005);
printf("增長率 %.1f%% -> %d 年\n", r, y);
}
// 解析解對比
double n_exact = log(15.0/13.0756) / log(1.01);
printf("\n解析解: %.2f 年後突破,即 %d 年\n", n_exact, 2005 + (int)ceil(n_exact));
return 0;
}
| 問題 | 風險 | 解決方案 |
|---|---|---|
| 浮點數精度 | 累積誤差導致邊界判斷錯誤 | 用 double,關鍵判斷加微小 epsilon |
| 溢出風險 | 長期預測人口數超出 double 範圍 | 用 long double 或任意精度庫 (GMP) |
| 模型過簡 | 忽略出生率/死亡率/遷徙變化 | 引入年齡結構模型、時間變化參數 |
P(t) = P₀ × e^(rt),更精確的自然增長模型dP/dt = rP(1-P/K),S型曲線