求大整数的阶乘

/*功能:求大整数的阶乘*/

/*

解题思路:

读入大整数,将被乘数和比其小一的乘数分别放在俩个字符串中,申明第三个字符串用来保存结果。然后进行循环。

其中涉及到字符和数字转化的技巧,具体实现请看代码。

*/

#include <iostream>

#include <string>

#include <cmath>

using namespace std;

string findmul(string str1);

int main()

{

	string str1,str2;//str1中存放被乘数,str2中存放乘数

	int len1,len2,len3,i,j,m,n;

	cout<<endl<<"      *************************求大整数的阶乘***********************"<<endl;

	cout<<"输入一个大整数:\n";

	cin>>str1;

	//找到乘数,即比str1小1的数

	str2=findmul(str1);

	//分别求出俩个大整数的长度

	len1=str1.size();

	len2=str2.size();

	//k中保存来至低位的进位,开始的时候应该为0

	int k=0;

	//str3中保存相乘后的结果,将str3的长度声明为1k,足以放结果了

	len3=1024*8;

	char *str3 = new char[len3];

	char *tem=str3;//当释放str3的内存是用

	//将str3中的内容清零,最后一个数字位放字符串结束标志'\0'

	memset(str3,'0',len3);

	str3[len3-1]=0;

	//若乘数为1则不再进行计算

	while(str2!="1")

	{

		//外层循环表示乘数,内层循环表示被乘数,用乘数的各位与被乘数相乘结果保存到str3中

		for(i=len2-1;i>-1;i--)

		{

			//从str3最后一个数字位的前一位存放数字,最后一个数字位已经放上了0

			len3=len3-1;

			m=len3-1;

			//拿出被乘数的每一位与该乘数位相乘

			for(j=len1-1;j>-1;j--,m--)

			{

				n=(str2[i]-'0')*(str1[j]-'0')+(str3[m]-'0')+k;

				if(n<10)

				{

					str3[m]=n+'0';

					k=0;

				}

				else

				{

					str3[m]=n%10+'0';

					k=n/10;

				}

			}

			//在最后一次要将来自低位的进位加到str3中

			while(k>10)

			{

				str3[m]=k%10+'0';

				k=k/10;

				m--;

			}

			str3[m]=k+'0';

			k=0;

		}

		//将乘数与被乘数分别赋以新值

		while(*str3 =='0')

			str3++;

		str1=str3;

		delete []tem;//释放掉内存

		str2=findmul(str2);

		len1=str1.size();

		len2=str2.size();

		//重新为str3初始化

		len3=1024*8;

		str3 = new char[len3];

		char *tem=str3;

		memset(str3,'0',len3);

		str3[len3-1]=0;

	}

	cout<<"运算结果为:"<<str1<<endl;

	return 0;

}

//功能:将被乘数减一表示的数字赋给一个字符串,该字符串作为乘数

string findmul(string str1)

{

	int len=str1.size();

	if(str1[len-1]=='0')

	{

		int i=len-1;

		while(str1[i]=='0')

		{

			str1[i]='9';

			i--;

		}

		str1[i]=str1[i]-'1'+'0';

		if(str1[0]=='0')

		{

			str1=str1.substr(1);

		}

	}

	else

	{

		str1[len-1]=str1[len-1]-'1'+'0';

	}

	return str1;

}


你可能感兴趣的:(阶乘)