c語言課程設計題目+3!!!!!
100
一刀可以把蛋糕分為兩個部分,現在給出要分為兩部分的面積的比值,希望求出切口的弦的長度。這裡當然要假定蛋糕是一個圓,並設其半徑為1。例如,輸入兩部分比值為1:1,切口是直徑,長為2;輸入1:2,應輸出1.9285;輸入10:1,應輸出1.4145。(本題為2010年ACM大賽題目)
提示:計算半弦長,可以利用公式a
2=2rh-h
2,計算弓形面積,用公式s=0.5*xita*r*r-a*sqrt(r*r-a*a); 其中h是弓形的高,r是半徑,xita是圓心角。一個思路是用二分搜索法尋找合適的h,使用該h求得的面積比值符合題目要求。
補充:#include <stdio.h>
#include <math.h>
#define inf 0.00000001//定義二分法取值范圍
const double pi = acos(-1.0);//pi=圓周率
//應用數學公式:弓形面積 S2=(rl-a(r-h))/2=r^2(A-sin(A))/2
double area(double jiaodu) //面積函數
{
return (jiaodu-sin(jiaodu))/2; //用數學公式的 計算化簡什麼的 就這樣了!!
}
double Ef(double a,double b) //定義二分法函數
{
double l,r,mid,t1,t2; //定義變量面積t1,t2. mid中間值的變量 l r不用說了吧~~
l = 0;r = pi;
while(fabs(r-l)>= inf) //調用絕對值函數fabs
{
mid = (l+r)/2.0;
t1 = area(mid);
t2 = pi - t1;
if(t1*b <= t2*a) l = mid + inf;
else r = mid - inf;
}
return 2*sin(l/2.0);
}
int main() //主函數返回類型為int
{
double a,b,t;
printf("一刀可以把蛋糕分為兩個部分現在給出要分為兩部分的面積的比值,希望求出切口的弦的長度。ps:問題碉堡了!!\n");
printf("例如\n輸入兩部分比值為1:1,切口是直徑,長為2;\n輸入1:2,應輸出1.9285;\n輸入10:1,應輸出1.4145\n");
printf("輸入比值,別太貪心,造成輸入過大~~要樂於分享\n\t");
while(scanf("%lf%lf",&a,&b)!=EOF) //eof表示文件尾,關於文件尾知識參考c語言書籍、 其實可以用!=0 替換 得到同樣效果、
{
if(a > b) //a<b就交換值
{
t = a;
a = b;
b = t;
}
printf("弦長=%.4lf\n",Ef(a,b)); //輸出並調用二分法函數
}
return 0; //這個不多說了吧~
}
最佳回答:
//平均成績(去掉最高分,去掉最低分)。這裡你可以先求出最大值和最小值,用總數減去它們後再求平均值
其余的你應該用吧
有不會的請追問
-
追問:
-
#include <stdio.h>
#include <math.h>
#define inf 0.00000001//定義二分法取值范圍
const double pi = acos(-1.0);//pi=圓周率
//應用數學公式:弓形面積 S2=(rl-a(r-h))/2=r^2(A-sin(A))/2
double area(double jiaodu) //面積函數
{
return (jiaodu-sin(jiaodu))/2; //用數學公式的 計算化簡什麼的 就這樣了!!
}
double Ef(double a,double b) //定義二分法函數
{
double l,r,mid,t1,t2; //定義變量面積t1,t2. mid中間值的變量 l r不用說了吧~~
l = 0;r = pi;
while(fabs(r-l)>= inf) //調用絕對值函數fabs
{
mid = (l+r)/2.0;
t1 = area(mid);
t2 = pi - t1;
if(t1*b <= t2*a) l = mid + inf;
else r = mid - inf;
}
return 2*sin(l/2.0);
}
int main() //主函數返回類型為int
{
double a,b,t;
printf("一刀可以把蛋糕分為兩個部分現在給出要分為兩部分的面積的比值,希望求出切口的弦的長度。ps:問題碉堡了!!\n");
printf("例如\n輸入兩部分比值為1:1,切口是直徑,長為2;\n輸入1:2,應輸出1.9285;\n輸入10:1,應輸出1.4145\n");
printf("輸入比值,別太貪心,造成輸入過大~~要樂於分享\n\t");
while(scanf("%lf%lf",&a,&b)!=EOF) //eof表示文件尾,關於文件尾知識參考c語言書籍、 其實可以用!=0 替換 得到同樣效果、
{
if(a > b) //a<b就交換值
{
t = a;
a = b;
b = t;
}
printf("弦長=%.4lf\n",Ef(a,b)); //輸出並調用二分法函數
}
return 0; //這個不多說了吧~
}