C语言 数学问题

Python025

C语言 数学问题,第1张

首先,这个题目有缺陷,也就是最后的未必是1滴。这和VUL D的取值都关。你只假设了最后一滴不到D毫升,有没有想过最后一滴大于D毫升的情形?

举个例子,如果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)清除缓冲区。或者都在后面加