程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言問答 >> c語言課程設計題目+3!!!!!

c語言課程設計題目+3!!!!!

編輯:C語言問答

c語言課程設計題目+3!!!!!

100

一刀可以把蛋糕分為兩個部分,現在給出要分為兩部分的面積的比值,希望求出切口的弦的長度。這裡當然要假定蛋糕是一個圓,並設其半徑為1。例如,輸入兩部分比值為1:1,切口是直徑,長為2;輸入1:2,應輸出1.9285;輸入10:1,應輸出1.4145。(本題為2010年ACM大賽題目)

提示:計算半弦長,可以利用公式a2=2rh-h2,計算弓形面積,用公式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;                                                 //這個不多說了吧~

}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved