📄 piview.cpp
字号:
//判断当前的通项是否已经为0
if(m_An[i]!=0)
Flag=1;
}
/////////////////////////////////////////////////////////////////////////////
//一次迭代完成,求下一次迭代的新加入项,并记录迭代次数;
k+=2;
m_Count++;
}
return;
}
void CPiView::Marchin()
{
/////////////////////////////////////////////////////////////////////////////
//开辟新的存储空间,用于存放中间结果
char *Result1=new char[m_Size];
/////////////////////////////////////////////////////////////////////////////
//中间循环计数变量
long Cnt1,Cnt2;
int Temp;
/////////////////////////////////////////////////////////////////////////////
//为arctan(1/5)设置初值
memset(m_An,0,m_Size);
memset(m_Result,0,m_Size);
m_Result[0]=1;m_Result[1]=6;
m_An[0]=1;m_An[1]=6;
/////////////////////////////////////////////////////////////////////////////
//计算16*arctan(1/5)
Cnt1=aTan(m_Result,5);
/////////////////////////////////////////////////////////////////////////////
//为arctan(1/239)设置初值
memset(Result1,0,m_Size);
memset(m_An,0,m_Size);
Result1[1]=4;
m_An[1]=4;
/////////////////////////////////////////////////////////////////////////////
//计算4*arctan(1/239)
Cnt2=aTan(Result1,239);
/////////////////////////////////////////////////////////////////////////////
//统计总的迭代次数
m_Count=Cnt1+Cnt2;
/////////////////////////////////////////////////////////////////////////////
//求最终结果:16*arctan(1/5)-4*arctan(1/239)
for(int i=m_Size;i>0;i--)
{
m_Result[i-1]-=1;
Temp=m_Result[i]+10-Result1[i];
m_Result[i]=Temp%10;
m_Result[i-1]+=Temp/10;
}
return;
}
void CPiView::Shanks()
{
/////////////////////////////////////////////////////////////////////////////
//开辟新的存储空间,用于存放中间结果
char *Result1=new char[m_Size];
char *Result2=new char[m_Size];
/////////////////////////////////////////////////////////////////////////////
//中间循环计数变量
long Cnt1,Cnt2,Cnt3;
int Temp;
/////////////////////////////////////////////////////////////////////////////
//为24*arctan(1/8)设置初值
memset(m_An,0,m_Size);
memset(m_Result,0,m_Size);
m_Result[0]=2;m_Result[1]=4;
m_An[0]=2;m_An[1]=4;
/////////////////////////////////////////////////////////////////////////////
//计算24*arctan(1/8)
Cnt1=aTan(m_Result,8);
/////////////////////////////////////////////////////////////////////////////
//为8*arctan(1/57)设置初值
memset(Result1,0,m_Size);
memset(m_An,0,m_Size);
Result1[1]=8;
m_An[1]=8;
/////////////////////////////////////////////////////////////////////////////
//计算8*arctan(1/57)
Cnt2=aTan(Result1,57);
/////////////////////////////////////////////////////////////////////////////
//为4*arctan(1/239)设置初值
memset(Result2,0,m_Size);
memset(m_An,0,m_Size);
Result2[1]=4;
m_An[1]=4;
/////////////////////////////////////////////////////////////////////////////
//计算4*arctan(1/239)
Cnt3=aTan(Result2,239);
/////////////////////////////////////////////////////////////////////////////
//统计总的迭代次数
m_Count=Cnt1+Cnt2+Cnt3;
/////////////////////////////////////////////////////////////////////////////
//求最终结果:24*arctan(1/8)+8*arctan(1/57)+4*arctan(1/239)
for(int i=m_Size-1;i>0;i--)
{
Temp=m_Result[i]+Result1[i]+Result2[i];
m_Result[i]=Temp%10;
m_Result[i-1]+=Temp/10;
}
return;
}
void CPiView::Gauss()
{
/////////////////////////////////////////////////////////////////////////////
//开辟新的存储空间,用于存放中间结果
char *Result1=new char[m_Size];
char *Result2=new char[m_Size];
/////////////////////////////////////////////////////////////////////////////
//中间循环计数变量
long Cnt1,Cnt2,Cnt3;
char Temp;
/////////////////////////////////////////////////////////////////////////////
//为48*arctan(1/18)设置初值
memset(m_An,0,m_Size);
memset(m_Result,0,m_Size);
m_Result[0]=4;m_Result[1]=8;
m_An[0]=4;m_An[1]=8;
/////////////////////////////////////////////////////////////////////////////
//计算48*arctan(1/18)
Cnt1=aTan(m_Result,18);
/////////////////////////////////////////////////////////////////////////////
//为32*arctan(1/57)设置初值
memset(Result1,0,m_Size);
memset(m_An,0,m_Size);
Result1[0]=3;Result1[1]=2;
m_An[0]=3;m_An[1]=2;
/////////////////////////////////////////////////////////////////////////////
//计算32*arctan(1/57)
Cnt2=aTan(Result1,57);
/////////////////////////////////////////////////////////////////////////////
//为20*arctan(1/239)设置初值
memset(Result2,0,m_Size);
memset(m_An,0,m_Size);
Result2[0]=2;
m_An[0]=2;
/////////////////////////////////////////////////////////////////////////////
//计算20*arctan(1/239)
Cnt3=aTan(Result2,239);
/////////////////////////////////////////////////////////////////////////////
//统计总的迭代次数
m_Count=Cnt1+Cnt2+Cnt3;
/////////////////////////////////////////////////////////////////////////////
//求最终结果:48*arctan(1/18)+32*arctan(1/57)-20*arctan(1/239)
for(int i=m_Size-1;i>=0;i--)
{
m_Result[i-1]-=1;
Temp=m_Result[i]+Result1[i]+10-Result2[i];
m_Result[i]=Temp%10;
m_Result[i-1]+=Temp/10;
}
return;
}
/////////////////////////////////////////////////////////////////////////////
//反正切求解函数arctan()
int CPiView::aTan(char *Result,int Orgin)
{
long Flag=1,Count=0;
int k=1,sign=0,Temp,Add;
/////////////////////////////////////////////////////////////////////////////
//待加项m_An再除去新加入项的分子,即m_An/=Orgin;
Add=0;
for(int i=0;i<m_Size;i++)
{
Temp=m_An[i]+Add*10;
m_An[i]=Temp/Orgin;
Add=Temp%Orgin;
}
/////////////////////////////////////////////////////////////////////////////
//待加项Result再除去新加入项的分子,即m_An/=Orgin;
Add=0;
for(i=0;i<m_Size;i++)
{
Temp=Result[i]+Add*10;
Result[i]=Temp/Orgin;
Add=Temp%Orgin;
}
while(Flag)
{
/////////////////////////////////////////////////////////////////////////////
//待加项m_An乘上新加入项的分母,即m_An*=k;
Add=0;
for(int i=m_Size-1;i>=0;i--)
{
Temp=m_An[i]*k+Add;
m_An[i]=Temp%10;
Add=Temp/10;
}
/////////////////////////////////////////////////////////////////////////////
//待加项m_An再除去新加入项的分子,即m_An/=(k+2);
Add=0;
for(i=0;i<m_Size;i++)
{
Temp=m_An[i]+Add*10;
m_An[i]=Temp/(k+2);
Add=Temp%(k+2);
}
/////////////////////////////////////////////////////////////////////////////
//待加项m_An再除去新加入项的分子,即m_An/=Orgin;
Add=0;
for(i=0;i<m_Size;i++)
{
Temp=m_An[i]+Add*10;
m_An[i]=Temp/Orgin;
Add=Temp%Orgin;
}
/////////////////////////////////////////////////////////////////////////////
//待加项m_An再除去新加入项的分子,即m_An/=Orgin;
Add=0;
for(i=0;i<m_Size;i++)
{
Temp=m_An[i]+Add*10;
m_An[i]=Temp/Orgin;
Add=Temp%Orgin;
}
if(sign==1)
{
/////////////////////////////////////////////////////////////////////////////
//将m_An加入结果Result中,即Result+=m_An;
Flag=0;
for(i=m_Size-1;i>=0;i--)
{
Temp=Result[i]+m_An[i];
Result[i]=Temp%10;
Result[i-1]+=Temp/10;
//判断当前的通项是否已经为0
if(m_An[i]!=0)
Flag=1;
}
}
else
{
/////////////////////////////////////////////////////////////////////////////
//将m_An加入结果Result中,即Result+=m_An;
Flag=0;
for(i=m_Size;i>=0;i--)
{
Result[i-1]-=1;
Temp=Result[i]+10-m_An[i];
Result[i]=Temp%10;
Result[i-1]+=Temp/10;
//判断当前的通项是否已经为0
if(m_An[i]!=0)
Flag=1;
}
}
k+=2;
/////////////////////////////////////////////////////////////////////////////
//设置下一个通项的极性,增加迭代次数
if(sign==0)
sign=1;
else
sign=0;
Count++;
}
return Count;
}
/////////////////////////////////////////////////////////////////////////////
//数据保存函数
void CPiView::FileSave()
{
FILE *fp1;
//文件打开错误信息
if((fp1=fopen("圆周率π.txt","w+"))==NULL)
{
AfxMessageBox("文件打开失败!",MB_OK,NULL);
return;
}
//将时间转换成秒数,便于理解
double time=((double)m_time1)/1000.0;
//写结果
fprintf(fp1,"有效位数: %d\n",m_Number);
fprintf(fp1,"计算方法: %s\n",m_Method);
fprintf(fp1,"迭代次数: %d\n",m_Count);
fprintf(fp1,"使用时间: %lf 秒\n",time);
fprintf(fp1,"Pi=%d.",m_Result[1]);
for(int i=0; i<m_Number; i++)
{
fprintf(fp1,"%d",(int)m_Result[i+2]);
if((i+1)%10==0)
fprintf(fp1," ");
if((i+1)%50==0)
fprintf(fp1,"\n ");
}
fclose(fp1);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -