⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 piview.cpp

📁 用Visual C++开发的图形化圆周率Pi计算程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			//判断当前的通项是否已经为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 + -