举个例子,如果VUL = 10 D = 2,那么一共就5滴,第一次滴1滴,第二次滴2滴,第三次的时候本来想滴3滴的,但只剩2滴了(4毫升>D),应该怎样滴?题目没说明噢~
那么姑且忽略你那些缺陷。这个类型题的数学模型也很简单,就是可以
1)先用VUL/D 求出滴数M,
2)然后用等差求和公式 n(1 + n)/2 <= M ,求出该不等式最大整数n的解
n使等号成立时,n-1就是停顿的次数,总秒数就是 n-1+M,(因为每一滴1秒)
n不能使等号成立时候,n就是停顿的次数,总秒数就是 n+M
由于你问题不严密,我也只能给你说的不严谨了。
这个算法C实现也很简单,n(1 + n)/2 <= M用for循环,每次计算保存结果,在大于的时候break即可。
当然你也可以直接用循环,不用这个数学模型,每次循环累加,记录的循环次数就是n
还有你给的代码不是很专业噢
#include <stdio.h>int main() {
double VUL, D
int i = 1
int sum = 0
while (scanf("%lf%lf", &VUL, &D) == 2) {
sum = 0
i = 1
while (VUL > 1e-6) {
if (VUL / i > D) {
VUL = VUL - i * D
sum = sum + i + 1
i++
}
if (VUL / i <= D) {
while (VUL > 1e-6) {
VUL = VUL - D
sum++
}
}
}
printf("%d\n", sum)
}
return 0
}
这题太坑
这些问题应该都是因为scanf函数后输入缓冲中残存的 回车被下一个 scanf直接接收到的原因。解决这个问题可以在每个 scanf函数前加一个 fflush(stdin)清除缓冲区。或者都在后面加