編程求pi
A. 編程計算pi值
1、對於精度設計,一般與時間成反比,演算法和時間也是成正比的
2、時間和CPU和內存又是成比例的。
以下非本人演算法:
#include
<cstdio>
using
namespace
std;
//某年Obfuscated
C
Contest佳作
long
a=10000,b,c=2800,d,e,f[2801],g;
main(){for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf(
"%.4d
",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);}
===========================
B. C語言編程用公式法求π,應該怎麼做
給你提個思路:
在這個公式中有幾個關鍵點:
每一項中有一個規律變化數字1,3,5,7,後面應該是9,11........;可以用i=1; i+=2;來表示。
每一項中都有規律變化分數相乘1/2 × 3/4 ×......這個乘法的截止方法為分母<i。
可以根據以上方法列出計算循環代碼,最後一項小於10-6為跳出循環條件;
C. 怎麼用C語言編程計算出π的值
一個足以讓你吐血的計算400位pi的C程序:
int a=10000, b, c=2800, d, e, f[2801], g;
main() {
for(; b-c; f[b++]=a/5);
for(; d=0,g=c*2; c -=14,printf("%.4d",e+d/a),e=d%a)
for(b=c; d+=f[b]*a,f[b]=d%--g,d/=g--,--b; d*=b);
}
理論上只要用大數演算法擴了就能一直算下去。我在Palm上面實現的那個就是基於這個演算法,沒有擴,算到4680位(受到Palm平台32k數組的長度限制)。
這個程序的特點是:你抱著想看看算pi原理的希望來讀這個程序,結果發現就是看了也還是看不懂~~
轉的,但是網路知道不允許貼地址哦
第二種:
用C語言編程π*π/6=1/1*1+1/2*2+1/3*3+。。。+1/n*n
#include<stdio.h>
#include<math.h>
main()
{
int n,i;
double s=0;
printf("輸入n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{s=s+1.0/(i*i);
}
printf("pai=%f",sqrt(s*6));
}
第三種:
求pi=(1+1/(1*3))*(1+1/(3*5))*(1+1/(5*7))…………直到最後一項的分數小於10的負6次方為止。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void main()
{
double pi,i,j,sigh,term;
i=1,j=3,sigh=1,term=1;
while(sigh>1e-6)
{
sigh=1/(i*j);
term=(1+sigh)*term;
i=i+2;
j=j+2;
}
pi=term;
printf("pi=%f\n",pi);
}
D. 編程求pi的值
利用「正多邊形逼近」的方法求出π值在很早以前就存在,我們的先人祖沖之就是用這種方法在世界上第一個得到精確度達小數點後第6位的π值的。
利用圓內接正六邊形邊長等於半徑的特點將邊數翻番,作出正十二邊形,求出邊長,重復這一過程,就可獲得所需精度的π的近似值。
假設單位圓內接多邊形的邊長為2b,邊數為i,則邊數加倍後新的正多邊形的邊長為:
周長為:
y=2 * i * x i:為加倍前的正多邊形的邊數
*程序與程序注釋
#include<stdio.h>
#include<math.h>
void main()
{
double e=0.1,b=0.5,c,d;
long int i; //i: 正多邊形邊數
for(i=6;;i*=2) //正多邊形邊數加倍
{
d=1.0-sqrt(1.0-b*b); //計算圓內接正多邊形的邊長
b=0.5*sqrt(b*b+d*d);
if(2*i*b-i*e<1e-15) break; //精度達1e-15則停止計算
e=b; //保存本次正多邊形的邊長作為下一次精度控制的依據
}
printf("pai=%.15lf\n",2*i*b); //輸出π值和正多邊形的邊數
printf("The number of edges of required polygon:%ld\n",i);
}
*運行結果
pi=3.141592653589794
The number of edges of required polygon:100663296
來源:考試大-計算機二級考試
E. 用C++編程計算π
#include<iostream>
#include<conio.h>
using namespace std;
void main()
{
double dPI;//π
int iFenMu;//分母
int iFenZi;//分子
int iCount;//計數
int iSign;//記錄正負號
//初始化各變數
iFenZi = 4;
iFenMu = 1;
iSign = 1;
dPI = 0;
for(iCount=1;iCount<=1000;iCount++)//用for語句實現
{
//公式π=4 – 4/3 + 4/5 – 4/7 + 4/9 -4/11 + … …
dPI += ((iSign)*(((double)iFenZi)/((double)iFenMu)));//π的累加,相當於dPI=dPI+(((iSign)*(((double)iFenZi)/((double)iFenMu))));
cout<<"PI["<<iCount<<"]="<<dPI<<" ";//輸出第iCount項的值
if(iCount%4==0)
{
cout<<endl;
}
iFenMu+=2;//分母增加2
iSign=-iSign;//正負號交替變化
}
cout<<"Press any key to continue"<<endl;
getch();
iFenZi = 4;
iFenMu = 1;
iSign = 1;
dPI = 0;
iCount =1;
while(iCount<=1000)//用while語句實現
{
dPI += ((iSign)*(((double)iFenZi)/((double)iFenMu)));
cout<<"PI["<<iCount<<"]="<<dPI<<" ";
if(iCount%4==0)
{
cout<<endl;
}
iFenMu+=2;
iSign=-iSign;
iCount++;
}
cout<<"Press any key to continue"<<endl;
getch();
iFenZi = 4;
iFenMu = 1;
iSign = 1;
dPI = 0;
iCount =1;
do//用do while語句實現
{
dPI += ((iSign)*(((double)iFenZi)/((double)iFenMu)));
cout<<"PI["<<iCount<<"]="<<dPI<<" ";
if(iCount%4==0)
{
cout<<endl;
}
iFenMu+=2;
iSign=-iSign;
iCount++;
}while(iCount!=1001);
}
F. C語言編程計算出π的值 最好有三種方法!! 急求 好人一生平安啊
我只說說π是怎麼近似計算出來的,大一應該學過高數,可以知道:tan π/ 4 =1,從而π=4*arctan1,應用泰勒公式將arctan(x)展開,就可以得到
把這展開式展開,直到最後一項的絕對值小於1e-6為止。
下面是C語言遞歸實現:
#include<stdio.h>
#include<math.h>
void main()
{
float fuc(int n);
float s,pi;
for(int i=1;i<10000;i++)
{s=1.0/(2*i-1);
if(s<1e-6)
break;}
pi=fuc(i);
pi=pi*4;
printf ("pi=%10.6f ",pi);
}
float fuc(int n)
{
float pi;
if(n==1) pi=1;
else if(n%2==0)
pi=fuc(n-1)+(-1.0)/(2*n-1);
else pi=f(n-1)+1.0/(2*n-1);
return(pi);
}
程序運行結果pi=3.141498.
希望能明白明白π的實現原理,增進你的理解。
G. C語言編程用公式法求π,應該怎麼做
給你提個思路:
在這個公式中有幾個關鍵點:
每一項中有一個規律變化數字1,3,5,7,後面應該是9,11........;可以用i=1;
i+=2;來表示。
每一項中都有規律變化分數相乘1/2
×
3/4
×......這個乘法的截止方法為分母
追問:
能寫個核心的代碼嗎,可以提高懸賞
追答:
午休的時候給你寫吧!現在有事。
評論
0
0
0
載入更多
H. 用C語言編程計算π的值
#include<stdio.h>
#include<math.h>//開根號我用了數學庫函數
int main()
{
double Pi=2,x=0,t;//我把第一項2作為Pi的初始值
while(1)
{
x=sqrt(x+2);//x是分母
t=2/x;//t是現在要乘的數
Pi=Pi*t;
if(t-1<1e-14) break;//因為t一定大於1,就這么寫了;精確到小數點後14位
}
printf("%.14lf\n",Pi);//小數點後14位
return 0;
}