假设地球上的新生资源按恒定速度增长。照此测算,地球上现有资源加上新生资源可供 x 亿人生活 a 年,或供 y 亿人生活 b 年。
为了能够实现可持续发展,避免资源枯竭,地球最多能够养活多少亿人?
在做此类编程题时不清楚要求什么,题中所给的那几个量对问题的求解有什么帮助,在深入了解牛吃草问题后得知:资源是在不断增生的,所以可根据题意进行方程组的确立:
设地球资源自然增长率为r,原始资源为P;
则 x*a=P+r*a和y*b=P+r*b;
求得 r=(xa-yb)/(a-b)
在确定z的值时又遇到如下问题
为什么确定z的值不考虑原始资源P,得解:
可持续发展只依赖资源再生速度 r
-
原始资源 P 是一个固定值,它会被逐渐消耗。
-
新生资源 rr是每年新增的资源,只要 z≤r,资源就不会枯竭。
-
因此,最大可持续人口 z仅由 r 决定,与 R无关。
总结:总的来说是对该问题的理解不够深刻。
正确代码:
#include <stdio.h>
int main() {
int x, a, y, b;
double z;
scanf("%d %d %d %d", &x, &a, &y, &b);
z =(double)(y * b-x * a ) / (b-a);
printf("%.2f", z);
return 0;
}
瑕疵代码:
#include <stdio.h>
int main() {
int x, a, y, b;
double z;
scanf("%d %d %d %d", &x, &a, &y, &b);
z =(y * b-x * a ) / (b-a);
printf("%.2f", z);
return 0;
}
改进方案:
z
是double
不会自动让/
变成浮点除法,因为/
的类型取决于它的操作数。如果
(y*b - x*a)
和(b - a)
都是int
,就会发生整数除法,即使赋值给double
也晚了。解决方案:
用
(double)
强制转换。或用
* 1.0
让其中一个操作数变成double
。推荐
* 1.0
写法,简洁且避免错误。例如:输入2 3 3 5 改进后
y * b-x * a=9 =9.0
b-a=2 =2.0
(y * b-x * a ) / (b-a)=9/2=4 =4.5
z=4.00 = 4.50
- z值的公式错误:虽然(x * a - y * b) / (a - b)与(y * b-x * a ) / (b-a);在数学上等价,但为了避免错误应写为更变准的方式。
知识点:
-
强制转
double
不会固定小数位数,只是确保计算时使用浮点运算。 -
输出时可用
%.nf
控制显示的小数位数。 -
浮点数有精度限制,必要时需考虑高精度计算方案。
double a = 0.1 + 0.2; // 实际可能是 0.30000000000000004