蓝桥杯练习:Cylinder(C语言)

题目描述
用一张纸和一把剪刀,你可以用以下方法剪出两个面来形成一个圆柱体: 将纸张水平(与较短的一面平行)裁切成两个矩形部分。 从第一部分开始,切出一个半径最大的圆。圆圈将形成圆柱体的底部。 将第二部分向上卷起,使其周长与圆的周长相等,并将卷的一端固定到圆上。注意,为了得到所需的周长,辊可能有一些重叠部分。 给定一张纸的尺寸,你能计算出一个圆柱体的最大可能体积吗?这个圆柱体可以用上面描述的程序来构造吗?

输入
输入由几个测试用例组成。每个测试用例由两个数字w和h(1≤w≤h≤100)组成,表示纸张的宽度和高度。
最后一个测试用例后面跟着一行,包含两个零。

输出
对于每个测试用例,打印一行尽可能大的圆柱体体积。把这个数字四舍五入到小数点后三位。

输入样例
10 10
10 50
10 30
0 0

输出样例
54.247
785.398
412.095

思路分析
分两种情况讨论,以H-2r为高,w为底面周长;另一种是以w为高,H-2r为底面周长,但是注意,针对第二种情况,H-2r围起来之后的半径r,当2*r>w明显是不成立的,所以此时最大r=w/2。
详细解释:https://blog.dotcpp.com/a/2608

代码实现

#include<stdio.h>
#define PI 3.1415926535898
int main()
{  
 double r,w,h,volume1,volume2;
 while(scanf("%lf%lf",&w,&h) && w!=0 && h!=0)
 {   
  r=h/2/(PI+1);
  if(2*r>w)  //当不满足条件时,r=w/2
   r=w/2;
  volume1=PI*r*r*w;
  r=w/2/PI;
  volume2=PI*r*r*(h-2*r);
  printf("%.3lf\n",(volume1>volume2)?volume1:volume2);
 }
 return 0;
}
发布了36 篇原创文章 · 获赞 5 · 访问量 995

猜你喜欢

转载自blog.csdn.net/matchless_QYW/article/details/104700981