C语言编程100题-7.6

7.6
在医院打点滴(吊针)的时候,如果滴起来有规律,先是滴一滴,停一下;然后滴二滴,停一下;再滴三滴,停一下…,现在有一个问题:这瓶盐水一共有v毫升,每一滴是d毫升,每一滴的速度是一秒(假设最后一滴不到d毫升,则花费的时间也算一秒),停一下的时间也是一秒,这瓶水什么时候能滴完呢?(0 < d < v <6000)
样例(先输入d,然后v):
0.5 1.7
6
样例输入:
0.5 1.7
样例输出:
6

#include<stdio.h>
int main()
{
       /*滴液情况:102030...n0X,其中0代表停一下,1≤X≤n+1
       于是总滴数a=(1+n)*n/2+X,总时间为a+n
       此外(a-1)*d<v≤ad,即a-1<v/d≤a,所以a=v/d+1*/
       float d, v; int a;
       scanf("%g%g", &d, &v);
       a = v / d+1;//接下来只要求n就ok了
       /*根据1≤X≤n+1,a=(1+n)*n/2+X,可得数学关系:n^2+n+2≤2a≤n^2+3n+2*/
       int n;
       for (n = 1; 2*a < n * n + n + 2 || 2*a > n * n + 3*n + 2; n++)//注意3n要写成3*n,本题主要考察数学转换
              ;
       printf("%d", a + n);
       system("pause");
       return 0;
}

猜你喜欢

转载自blog.csdn.net/nollysoul/article/details/89819982