码迷,mamicode.com
首页 > 其他好文 > 详细

可怕的阶乘

时间:2015-05-13 00:59:45      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:

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


接口说明

原型:
void CalcNN(int n, char *pOut)
输入参数:
int n 需要计算的阶乘数
输出参数:

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

      

 具体计算算法如下:

1、定义一个足够的大的数组array[1000],用来存储计算结果的每一位数;

2、从数组第一位array[o]开始,临时变量int temp 存储数组每一位数与当前阶乘数的运算的结果,记得加上上一位的进位数。 结果 = array[j] * 被乘数 +进位

3、处理每一个结果,只保留个位数 array[j] = temp % 10

4、计算进位数,结果加入数组下一位元素相乘结果。重复步骤2,直到遍历当前数组每一个元素;

5、当前数组成员遍历完毕,处理最后一位进位数,可能不止一位,要进行循环处理,每进一位,数组长度增加一个;

6、进入下一个阶乘数,继续上述步骤,直到阶乘完成。

7、转换成字符数组。

代码如下:

void CalcNN(int n, char *pOut)
{
	if (n<0||n>100||pOut==NULL)
	{
		return;
	}
	if (n==0||n==1)
	{
		pOut[0]=1;
		pOut[1]='\0';
		return;
	}
	int array[1000]={0};
	array[0]=1;
	int carry=0;
	int length=1;
	int temp=0;
	for (int i=2;i<=n;i++)
	{
		carry=0;
		for (int j=0;j<length;j++)
		{
			temp=array[j]*i+carry;
			array[j]=temp%10;
			carry=temp/10;
		}
		while (carry)
		{
			array[length]=carry%10;
			length++;
			carry=carry/10;
		}
	}
	int j=0;
	for (int i=length-1;i>=0;i--)
	{
		pOut[j]='0'+array[i];
		j++;
	}
	pOut[j]='\0';
	return;
}


可怕的阶乘

标签:

原文地址:http://blog.csdn.net/sinat_24520925/article/details/45677181

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!