华为OJ软件训练题中级——可怕的阶乘大数处理

题目标题

  • 计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值。例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围。请设计一个程序,使其可以计算100以内的数的阶乘,结果用字符串的形式输出

详细描述:

  • 接口说明

原型:

void CalcNN(int nchar *pOut)

输入参数:

int 需要计算的阶乘数

输出参数:

char *pOut 结算结果,内存由调用者负责管理

返回值:

限制:

举例:

 


对此这种类型题目基本考察的都是大整数计算,还有整数和字符之间转换,细心就好,没有复杂的算法思想。

#include<iostream>
//#include<string>
//#include<algorithm>
//#include<cmath>
//#include<vector>
//#include<stack>
//#include<iomanip>
using namespace std;

        
void CalcNN(int n,char *pOut)
{
	int i=0,j;
	int c,tmp=n,slen;
	char ct;
	if(n==0 || n==1)
	{
		pOut[0]='1';
		pOut[1]=0;
		return;
	}
	while(tmp)
	{
		pOut[i++]=(tmp%10)+'0';
		tmp=tmp/10;
	}
	pOut[i]=0;
	slen=strlen(pOut);
	//cout<<slen<<endl;
	for(i=n-1;i>1;i--)
	{
		c=0;
		
		for(j=0;j<slen;j++)
		{
			tmp=i*(pOut[j]-'0')+c;
			if(tmp>9)
			{
				pOut[j]=(tmp%10)+'0';
				c=tmp/10;
			}
			else 
			{
				pOut[j]=tmp+'0';
				c=0;
			}
		}
		if(c!=0)
		{
			while(c)
			{
				pOut[slen++]=(c%10)+'0';
				c/=10;
			}
			pOut[slen]=0;
		}
		
	//	cout<<i<<" "<<pOut<<endl;
	}
	for(i=0,j=slen-1;i<j;i++,j--)
	{
		
		ct=pOut[j];
		pOut[j]=pOut[i];
		pOut[i]=ct;
	}
	return;
}

int main()
{
	char *ss=(char *)malloc(1000*sizeof(char));
    CalcNN(13,ss);
		cout<<ss<<endl;
	return 0;
}

相关文章

自1998年我国取消了福利分房的政策后,房地产市场迅速开展蓬...
文章目录获取数据查看数据结构获取数据下载数据可以直接通过...
网上商城系统MySql数据库设计
26个来源的气象数据获取代码
在进入21世纪以来,中国电信业告别了20世纪最后阶段的高速发...