割圆术把我割死了

pa_pa_chong1978 2008-12-14 11:40:53
#include <stdio.h>
#include <math.h>
main()
{
float Spai,Sn,S2n,Hn,Xn=1,X2n,S6=2.6;
int n,i;
printf("Please input n:");
scanf("%d",&n);
printf("\n");
if(n%6==0)
{
for(i=2;i*6<=n;i++)
{
Hn=sqrt(1-Xn*Xn/4);
X2n=sqrt(Xn*Xn/4+(1-Hn)*(1-Hn));
S2n=Sn+i*6*0.5*Xn*(1-Hn);
Xn=X2n;
Sn=S2n;
}
}
else printf("The n is wrong!/n");
Spai=(3*S2n-Sn)/2;
printf("The pai is %f",Spai);
getch();
}
这割圆术把我割死了,怎么老是不对
...全文
477 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pa_pa_chong1978 2008-12-22
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
main()
{
float S2n,Hn,Xn=1.0,X2n,Sn=2.59807621135332;
int n,i;
printf("Please input n:");
scanf("%d",&n);
printf("\n");
if(n%6==0)
{
for(i=12;i<=n;i*=2)
{
Hn=sqrt(1.0-Xn*Xn/4.0);
X2n=sqrt(Xn*Xn/4.0+(1.0-Hn)*(1.0-Hn));
S2n=Sn+i*0.5*0.5*Xn*(1.0-Hn);
Xn=X2n;

Sn=S2n;
}
}
else printf("The n is wrong!/n");

printf("The pai is %f",Sn);
getch();
}
现在对了,谢谢大家,尤其是langbch;我主要错在没有按照6*n^x翻倍 。
liangbch 2008-12-22
  • 打赏
  • 举报
回复
对照我的程序(主要是每一步骤的运算结果),仔细检查一下你的程序,看看那些地方错了。程序不大,应该很容易解决的。
pa_pa_chong1978 2008-12-20
  • 打赏
  • 举报
回复
麻烦问问,我的算法和你一个道理呀,为什么我答案差的比较大,等于3.59
nicholasfly 2008-12-19
  • 打赏
  • 举报
回复
hoho有结果了,hoho
liangbch 2008-12-19
  • 打赏
  • 举报
回复
和2#算法不同,这个算法是用正(6,12,24,48...)多边形的面积来估计圆的面积的。
而2楼是用正边形(6,12,24,48,...)的周长来表示估计圆的周长的。2楼不但逻辑简单,只需使用正弦和余弦半角公式,而且更准确。
liangbch 2008-12-19
  • 打赏
  • 举报
回复
n=6,    pi=2.59807621
n=12, pi=3.00000000
n=24, pi=3.10582854
n=48, pi=3.13262861
n=96, pi=3.13935020
n=192, pi=3.14103195
n=384, pi=3.14145247
n=768, pi=3.14155761
n=1536, pi=3.14158389
n=3072, pi=3.14159046
n=6144, pi=3.14159211
n=12288,pi=3.14159252
n=24576,pi=3.14159262
liangbch 2008-12-19
  • 打赏
  • 举报
回复
看看这个吧
#include <stdio.h> 
#include <math.h>

int checkN(int n)
// if n is 6,12,24,48,96 return 1
// else return 0
{
int k=6;
while (k<n)
k*=2;
return (k==n);
}

void main()
{
double x0,h0,s0,x1,h1,s1;

int n,k;

printf("Please input n:");
scanf("%d",&n);
if (!checkN(n) )
{
printf("The n is wrong!/n");
return ;
}
k=6;

x0=1; //6边形的边长
h0=sqrt(3)/2.0; //6边形圆心到边的高
s0= k * x0 * h0 /2; //6边形的面积

while (k<n)
{
x1= sqrt( (x0/2)*(x0/2) + (1-h0) * (1-h0) ); // 递推计算S(2k), H(2k), x(2k)
h1= sqrt(1- (x1/2.0) * (x1/2.0));
s1=s0 + k *0.5*x0* (1.0-h0);

k*=2;
x0=x1;
h0=h1;
s0=s1;
}
//因为 s = pi * r ^ 2,
//故pi= s/(r^2),这里r=1; 故 pi=s;

printf("pi=%.8lf\n",s0); //祖冲之计算到24576

}
Gsky33 2008-12-19
  • 打赏
  • 举报
回复
先仔细看看!
pa_pa_chong1978 2008-12-18
  • 打赏
  • 举报
回复
http://user.qzone.qq.com/76905877/infocenter
我把我博客转过来,请教各位了,谢谢。
pa_pa_chong1978 2008-12-18
  • 打赏
  • 举报
回复
晕,要注册用户才能看到,这里不能发图片呀,郁闷。
pa_pa_chong1978 2008-12-18
  • 打赏
  • 举报
回复
http://bbs.pep.com.cn/viewthread.php?tid=426166&extra=page%3D1&frombbs=1
原教程在这里,不知道你们看不看的到,我说不清楚。是一种几何方法。
liangbch 2008-12-17
  • 打赏
  • 举报
回复
你能解释一下你的算法吗,用的是什么公式,否则别人很难帮你修改好。
兰博618 2008-12-17
  • 打赏
  • 举报
回复
不错,不错
pa_pa_chong1978 2008-12-17
  • 打赏
  • 举报
回复
继续请教
pa_pa_chong1978 2008-12-15
  • 打赏
  • 举报
回复
谢谢liangbch的算法,很精确。但我这是想验证下“割圆术”中国古代的一种算法,书上有介绍。
http://bbs.pep.com.cn/viewthread.php?tid=426166&extra=page%3D1&frombbs=1
pa_pa_chong1978 2008-12-15
  • 打赏
  • 举报
回复
谢谢提醒,发现错误所在。但修改后,结果还是不对,怎么算都等于3.59。
liangbch 2008-12-14
  • 打赏
  • 举报
回复
不太明白你的算法,我给你改了一下(算法和你的不同),看看是否对你有所帮助

#include <stdio.h> 
#include <math.h>

int checkN(int n)
// if n is 6,12,24,48,96 return 1
// else return 0
{
int k=6;
while (k<n)
k*=2;
return (k==n);
}

void main()
{
double sinx,cosx,pi,t;
int n,k;

printf("Please input n:");
scanf("%d",&n);
if (!checkN(n) )
{
printf("The n is wrong!/n");
return ;
}
sinx=0.5; //sin 30度
cosx=sqrt(1.0-sinx*sinx); //cos 30度

for(k=6;k<n;k*=2)
{
t=cosx;
cosx= sqrt((1+ t)/2); //余弦半角公式
sinx= sqrt((1 -t)/2); //正弦半角公式
}
pi= k * sinx;
printf("pi=%.6lf\n",pi);

}

该程序的运行结果为
n=6,   pi=3.000000
n=12, pi=3.105829
n=24, pi=3.132629
n=48, pi=3.139350
n=96, pi=3.141032
n=192, pi=3.141452
n=384, pi=3.141558
n=768, pi=3.141584
n=1536,pi=3.141590
chenzhiyubuaa 2008-12-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
main()
{
float Spai,Sn,S2n,Hn,Xn=1,X2n,S6=2.6;
int n,i;
printf("Please input n:");
scanf("%d",&n);
printf("\n");
if(n%6==0)
{
for(i=2;i*6 <=n;i++)
{
Hn=sqrt(1-Xn*Xn/4);
X2n=sqrt(Xn*Xn/4+(1-Hn)*(1-Hn));
S2n=Sn+i*6*0.5*Xn*(1-Hn); /* Sn 没有初始化 */
Xn=X2n;
Sn=S2n;
}
}
else printf("The n is wrong!/n");
Spai=(3*S2n-Sn)/2;
printf("The pai is %f",Spai);
getch();
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧