大象喝水问题
自己解法
#include
int main()
{
const double pi = 3.14159;
int h, r, count=0, s=20;
double v;
scanf("%d %d", &h, &r);
v = pi * r * r * h / 1000;
while(s>0){
s -= v;
count++;
}
printf("%d", count);
return 0;
}
看到答案写法
#include
int main()
{
int h, r;
double v;
scanf("%d%d", &h, &r);
v = 3.14159*r*r*h;
printf("%d\n", (int)(20*1000/v+0.99999));
return 0;
}
我觉得我的代码也能实现目的,为啥系统判错(我是初学者,ceil函数还没学,不会向上取整)
因为浮点数相减结果是有误差的,答案的写法能够避免。比如v=2000,那么答案能够保证误差在10的-6次方以内时,结果一定是10
而你的代码,就不能保证了,一旦有任何误差,比如s减去v后变为0.0000001,你的代码就会多加1,你没有考虑误差范围
系统判错的原因是:当前的代码是向下取整,而题目要求的是向上取整,这个地方需要使用ceil函数或者在最后答案加上0.99999以实现向上取整的效果。可以使用向上取整函数 ceil
#include <math.h>
#include <stdio.h>
int main()
{
int h, r;
double v;
scanf("%d%d", &h, &r);
v = 3.14159 * r * r * h;
printf("%d\n", (int) ceil(20 * 1000 / v));
return 0;
}
也可以用整数除法和判断来实现向上取整:
#include <stdio.h>
int main()
{
int h, r, count;
double v;
scanf("%d%d", &h, &r);
v = 3.14159 * r * r * h;
count = 20 * 1000 / v;
if (20 * 1000 % v != 0)
count++;
printf("%d\n", count);
return 0;
}
s是整数,所以如果写s -= v,也就是整数减去双精度浮点,这样做会先算出double的结果,再强转int:
int a = 20;
a -= 0.1 // a = 19,先算出19.9,再强转int,也就是(int)19.9,向下取整,得19
所以,应该把s写成double类型就行了:
#include<stdio.h>
int main()
{
const double pi = 3.14159;
int h, r, count=0;
double s=20.0; // 改成double
double v;
scanf("%d %d", &h, &r);
v = pi * r * r * h / 1000;
while(s>0){
s -= v;
count++;
}
printf("%d", count);
return 0;
}
你这种想法也挺好的,是一种思路👍👍👍