這是一道流傳已久的程式設計面試題:北京有一套房子,價格200萬元。假設房價每年上漲10%(每年漲幅按200萬基礎計算,即單利),一位軟體工程師年薪固定40萬元。若他不貸款、不漲薪、無其他收入,且每年「不吃不喝」將所有薪水儲蓄,請問需要幾年才能湊夠錢買下這套房子?
設年數為 n 年:
求最小整數 n 使得:40n ≥ 200 + 20n → 20n ≥ 200 → n ≥ 10。
所以答案是 10年。
以下是兩種常見的程式碼寫法,均可得到正確結果:
#include <stdio.h>
int main() {
int i = 0;
float salary = 40; // 年薪(萬)
float value = 200; // 初始房價(萬)
float rate = 0.1; // 漲幅 10%
// 每年漲價額固定為 200萬 * 10% = 20萬
while (salary * i < value + value * rate * i) {
i++;
}
printf("經過 %d 年後,軟體工程師可以買到房子!\n", i);
return 0;
}
#include <stdio.h>
int main() {
int i = 0, flag = 0;
float salary = 40;
float begin_value = 200;
float rate = 0.1;
float late_value = begin_value * rate + begin_value; // 第一年房價
while (salary * i < late_value) {
i++;
late_value += late_value * rate; // 這裡改成複利,但題目要求單利
if (i > 100) { // 防止邏輯錯誤導致無限迴圈
flag = 0;
break;
}
}
if (flag)
printf("經過 %d 年後,軟體工程師可以買到房子!\n", i);
else
printf("嗨,工作輩子,軟體工程師都不能買到房子,好慘哦!\n");
return 0;
}
late_value += late_value * rate),會導致答案偏大。float 儲存金額足夠,但實際工程中建議用整數(分為單位)避免精度問題。while 條件用 < 而非 <=,確保剛好湊夠時跳出迴圈。若改為複利(房價每年在上一年基礎上漲 10%),方程變為 40n ≥ 200 × 1.1^n,此時方程無解析解,需用迴圈或二分法求解,答案約為 永遠買不起(房價增長快於儲蓄)。這也是版本二加入 i > 100 保護的原因。