UVA 12457
题目描述:
这题就是要求椭圆周长。
——————————————————————————————————————
题目思路:
1、积分+龙贝格积分加速(我的方法,代码比较长)
这题看到以后,我很易做图的百度了一下椭圆周长计算方法。得到一个积分公式。
但是由于本题对精度要求很高,至少到小数点后6位。这样积分时的ds就要很小,这就使得程序会tle。
此时脑海中刹那闪过了数值分析里学的积分加速。
于是翻课件,找出来龙贝格公式,于是,就过了。。(有点点易做图,至此我才发现计算方法的重要作用)
2、(代码见下,待探究)
——————————————————————————————————————
题目细节:
学会了pi的几种求法:
1、pi=acos(-1.0)
2、pi=(4.0*atan(1.0))
(本方法的原理待探究)
——————————————————————————————————————
源代码1:
[cpp]
#include <iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
#define Pi 3.1415926535898
#define ds 0.0000005
#define M 40
double a = 0,b = 0;
double f(double si)
{
return sqrt(1-((a*a-b*b)/(a*a))*sin(si)*sin(si));
}
long Sq(int k)
{
long m = 1;
for(;k>0;k--)
m*=2;
return m;
}
double rom(double a,double b,double e)
{
double T[M],S[M],C[M],R[M],y;
int k = 0,i;
double h = (b-a)*1.0;
T[1] = h/2.0*(f(a)+f(b));
h /=2.0;
for(k=1;k<=M;k++,h/=2)
{
y=0;
for(i=1;i<=Sq(k-1);i++)
{
y+=f(a+(2*i-1)*h);
}
T[Sq(k)]=T[Sq(k-1)]/2.0+h*y;
S[Sq(k-1)]=4.0/3*T[Sq(k)]-1.0/3*T[Sq(k-1)];
if(k-2>=0)
C[Sq(k-2)]=16.0/15*S[Sq(k-1)]-1.0/15*S[Sq(k-2)];
if(k-3>=0)
R[Sq(k-3)]=64.0/63*C[Sq(k-2)]-1.0/63*C[Sq(k-3)];
if(k-4>=0){
if(fabs(R[Sq(k-3)]-R[Sq(k-4)])<e)
break;}
}
return R[Sq(k-3)];
}
int main()
{
int t = 0,k = 0;
double ans = 0;
scanf("%d",&t);
for(k = 1;k<=t;k++)
{
scanf("%lf %lf",&b,&a);
ans = 4*a*rom(Pi/2,0,ds);
printf("Case %d: %.6lf\n",k,fabs(ans));
}
return 0;
}
源代码2:
[cpp]
#include<stdio.h>
#include<string.h>
#include<math.h>
const double pi=(4.0*atan(1.0));
double a,b; www.zzzyk.com
int main(){
int i,j,T,cas=0;
scanf("%d",&T);
while(T--){
scanf("%lf%lf",&b,&a);
double e=1.0-(b*b)/(a*a);
double sum=1.0,tmp=1.0;
for(i=1;i<100000;i++){
double r=(2.0*i-1)/(2.0*i);
sum-=(tmp*=r*r*e)/(2.0*i-1);
}
printf("Case %d: %.8f\n",++cas,2.0*pi*a*sum);
}
return 0;
}
补充:软件开发 , C语言 ,