`
java-mans
  • 浏览: 11392402 次
文章分类
社区版块
存档分类
最新评论

大整数阶乘的计算 N!

 
阅读更多

1、先说小点的数的阶乘计算:

// n!	
unsigned long fac(int n)
{
	if(n == 0)
		return 1;
	else
		return n * fac(n - 1);
}


2、如果需要稍微提高效率,还可以:

unsigned long fac_ex(int n)
{
	if(n == 0 || n == 1)
		return 1;
	else
		return n * (n - 1) * fac(n - 2);
}

3、依此类推,继续想提高一点效率:

unsigned long fac_ex1(int n)
{
	if(n == 0 || n == 1)
		return 1;
	else if(n == 2)
		return 2;
	else
		return n * (n - 1) * (n - 2) * fac(n - 3);
}

unsigned long fac_ex3(int n)
{
	if(n == 0 || n == 1)
		return 1;
	else if(n == 2)
		return 2;
	else if(n == 3)
		return 6;
	else
		return n * (n - 1) * (n - 2) * (n - 3) * fac(n - 4);
}

4、如果不像用递归,那就用下面的,效率比递归的要好:


unsigned long fac_ex2(int n)
{
	unsigned long ret = 1;
	for(int i = 2; i <= n; ++i)
	{
		ret *= i;
	}
	return ret;
}

5、如果对空间要求不高,可以把一些数据计算出来,放在静态区:


unsigned long fac_ex10(int n)
{
	static int facArr[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
	fac_ex2(11)};		// fac_ex2(11) will be calculated only once
	if(n >= 0 && n < sizeof(facArr) / sizeof(facArr[0]))
		return facArr[n];
	else
		return n * (n - 1) * (n - 2) * (n - 3) * (n - 3) * (n - 3)
		 * (n - 4) * (n - 5) * (n - 6) * (n - 7) * (n - 8) * (n - 9)
		 * (n - 10) * fac(n - 11);
}

6、上面的是放在函数里面,也可以放在文件作用域里或全局作用域:

static int facArr[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
	fac_ex2(11)};	// fac_ex2(11) will be calculated only once, at the initialization of the app


7、上面的不讨论了,现在讨论大整数阶乘:

// 大整数阶乘		
void	fac_bigInteger(int n, int result[], int maxSize, int *resultLen)
{
	if(maxSize < 1)
		return;
	memset(result, 0, maxSize * sizeof(int));
	result[0] = 1;
	int currLen = 1;
	
	for(int j = 2; j <= n; ++j)
	{
		int carry = 0;
		for(int k = 0; k < maxSize && k < currLen; ++k)
		{
			int temp = result[k] * j + carry;
			if(temp < 10)
			{
				result[k] = temp;
				carry = 0;
			}
			else
			{
				carry = temp / 10;
				result[k] = temp - carry * 10;
			}
		}
		if(carry > 0)
		{
			char buf[512];
			sprintf(buf, "%d", carry);
			int currLenTemp = currLen;
			for(int i = strlen(buf) - 1; i >= 0; --i)
			{
				result[currLenTemp++] = buf[i] - '0';
			}
			currLen = currLenTemp;
		}
	}
	*resultLen = currLen;
}

测试代码:

void ccTestFac()
{
#if 1	
	int arr[1024];
	int len;
	fac_bigInteger(50, arr, 1024, &len);
	for(int i = len - 1; i >= 0; --i)
	{
		std::cout << arr[i];
	}
	std::cout << endl;
	std::cout << len << std::endl;
	
#endif
}





分享到:
评论

相关推荐

    求n个整数的阶乘1!+2!+3!+...n!,VB.net源代码

    求n个整数的阶乘1!+2!+3!+...n!,VB.net源代码

    编写程序,输入整数 n,计算并输出 n 的阶乘

    计算阶乘 编写程序,输入整数 n,计算并输出 n 的阶乘。 n!=1×2×3×⋯×n 其中:0≤n≤20 本程序修改result数组大小可计算n&gt;20的阶乘

    无限长整数的阶乘计算(10000!只需要0.187秒即可,数组型(窗口版)

    内部设计了一个Unlimit无限宽的整数,用多个uint拼接起来,直接...这个版本与"无限长整数的阶乘计算(10000!只需要0.5秒即可)(窗口版)"不同之处在于改List类型为Array类型,这样做使数组下标计算的速度极大地提高了。

    阶乘计算 编写程序,对给定的n(n≦100),

    阶乘计算 编写程序,对给定的n(n≦100),计算并输出k的阶乘k!(k=1,2,…,n)的全部有效数字。由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的...

    求N的阶乘(大整数乘法)

    精确计算N的阶乘。其中,N可能是小于200的任意正整数。 【输入形式】 输入文件为当前目录下的factor.in。 该文件只包含一个正整数,表示需要求该正整数的阶乘。 【输出形式】 输出文件为当前目录下的factor...

    编程实现计算:1!+2!+3!+……+N!的值,要求定义并调用函数计算N!。

    编程实现计算:1!+2!+3!+……+N!的值,要求定义并调用函数计算N!。

    微机原理 计算N! 存代码

    计算N!: 编写计算N阶乘的程序,数值N由键盘输入,N的值要在0到65536之间(用一个16位的字表示),结果在显示器上显示。

    求n!输出1-N的阶乘

    求n!输出1-N的阶乘.c语言,一个.cpp文件

    JAVA求N的阶乘

    阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号...自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。 亦即n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

    大整数阶乘

    (2)用该大整数计算n的阶乘并显示出来。(n∈[1,100]) 注:为了简化,可不考虑负数,则遇上形如“2-4”这样的表达式需要报错。 2、程序执行过程 (1)系统从键盘读入自然数n,直到输入了合法的n为止。 ...

    python计算n的阶乘的方法代码

    即:n!=1×2×3×…×n。 首先导入math模块,然后调用factorial()函数来计算阶乘。 1 math.factorial(x) import math value = math.factorial(x) 2. reduce函数 def factorial(n): return reduce(lambda x,y:x*y,...

    大整数阶乘 C++

    众所周知,阶乘运算的增长速度特别快(比2^n的增长速度快),对于较小整数的阶乘运算采用简单的递规算法可以实现,但是对于大整数的乘法(比如1000!),则传统的递规算法就失去了作用。该程序的思路是:1.开辟一个...

    编写一个JSP程序,计算整数的阶乘,并显示出结果。(已多次完善)

    功能:通过表单提交一个正整数,然后计算它的阶乘。 方法:先声明计算阶乘的方法,再调用该方法,最后在页面上输出结果。其中要对提交的是否为整数作判断,是整数则进行阶乘计算,不是整数则要求重新提交。

    python算阶乘小程序

    python算阶乘小程序 python算阶乘小程序

    求整数n的阶乘(Matlab)

    采用Matlab计算整数n的阶乘。子函数形式,直接调用。 采用if-else语句实现,非常方便。文档里面也有注释,方便学习。结果输出到命令窗口。

    使用递归计算阶乘

    java中使用递归方法计算阶乘的代码示例

    大整数N!计算和存储原理和(C++源代码)

    在计算N!时,由于整数N太大,则它阶乘结果就会产生溢出错误。

    C语言上机 | 求1! ~n! 的值

    的值。要求定义和调用函数fact(n)计算n!,函数类型为double。 【输入形式】 从键盘输入一个正整数n。 【输入输出样例1】(下划线部分表示输入) Enter n: 3 1!=1 2!=2 3!=6 【样例说明】 输入提示符后要加一个空格...

    用c语言求一个整数的阶乘

    不懂的都在里面了,自己看在不懂给我发邮箱891694742@qq.com

    python计算阶乘和的方法(1!+2!+3!+…+n!)

    方法二:使用递归函数调用阶乘方法求和(其中n的值在1~40之间) def jie(n): if n == 1: return 1 else: return n*jie(n-1) n = int(input()) sum = 0 if n &lt; 1&gt; 40: print(请重新输入数据) else:

Global site tag (gtag.js) - Google Analytics