程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> UVA 12457

UVA 12457

編輯:關於C語言

題目描述:

這題就是要求橢圓周長。

——————————————————————————————————————

題目思路:

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.2cto.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; 

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