📄 gb-serise.cpp
字号:
//级数展开法计算pi值
#include <stdio.h>
void calculate(int *,int *,double,double,int);
void print(int *,double,double,int);
main()
{
int bite,i;
long double counter=0,time=0;
printf("\n************************级数展开法计算pi值************************\n");
do{
printf("\n输入所要求的pi的最大位数(正整数):\n");
scanf("%d",&bite);
if(bite<=0)
printf("输入错误!重新输入一个正整数!\n");
}while(bite<=0);
//动态分配数组大小,得到两个数组保存所求值
bite=bite+10;
printf("%d\n",bite);
int *dpi=new int[bite];
int *dtemp=new int[bite];
//数组初始化为0
for(i=0;i<bite;i++)
{
dpi[i]=0;
dtemp[i]=0;
}
//设通项第一项初始值
dpi[1]=2;
dtemp[1]=2;
//求pi值
int sup=1,sdown=3,temp,carry,flag=1;
//先迭代依次求出级数的各个通项,在对通项求和
while(flag && (counter<2e+9))
{
carry=0;
for(i=bite-1;i>0;i--)
{
temp=dtemp[i]*sup+carry;
dtemp[i]=temp%10;
carry=temp/10;
time++;
}
carry=0;
for(i=0;i<bite;i++)
{
temp=dtemp[i]+10*carry;
dtemp[i]=temp/sdown;
carry=temp%sdown;
time++;
}
flag=0;
for(i=bite-1;i>0;i--)
{
temp=dpi[i]+dtemp[i];
dpi[i]=temp%10;
dpi[i-1]+=temp/10;
flag|=dtemp[i];
time++;
}
sup++;
sdown+=2;
counter++;
}
//打印结果
printf("\n**************************计算结果显示************************\n");
printf(" pi=3.\n");
for(i=0;i<bite-10;i++)
{
if(i%5==0)
{
if(i%50==0)
printf("小数后%5d-%5d位:",i+1,i+50);
else printf(" ");
}
printf("%d",dpi[i+2]);
}
printf("\n");
printf("*************************算法复杂度***************************\n");
printf("计算次数: %12.0f次\r\n",counter);
printf("时间复杂度: %12.0f\r\n",time);
printf("空间复杂度: %12d(int)\r\n",bite*2);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -