加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 02:36:37 所属栏目:大数据 来源:网络整理
导读:题目标题: 计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值。例如13!?=?6227020800,已经超过了我们常用的unsigned?int类型的取值范围。请设计一个程序,使其可以计算100以内的数的阶乘,结果用字符串的形式输出 详细描述: 接口说明

题目标题:

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

详细描述:

  • 接口说明

原型:

void?CalcNN(int?n,?char?*pOut)

输入参数:

int?n?需要计算的阶乘数

输出参数:

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读