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,计算并输出 n 的阶乘。 n!=1×2×3×⋯×n 其中:0≤n≤20 本程序修改result数组大小可计算n>20的阶乘
内部设计了一个Unlimit无限宽的整数,用多个uint拼接起来,直接...这个版本与"无限长整数的阶乘计算(10000!只需要0.5秒即可)(窗口版)"不同之处在于改List类型为Array类型,这样做使数组下标计算的速度极大地提高了。
阶乘计算 编写程序,对给定的n(n≦100),计算并输出k的阶乘k!(k=1,2,…,n)的全部有效数字。由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的...
精确计算N的阶乘。其中,N可能是小于200的任意正整数。 【输入形式】 输入文件为当前目录下的factor.in。 该文件只包含一个正整数,表示需要求该正整数的阶乘。 【输出形式】 输出文件为当前目录下的factor...
编程实现计算:1!+2!+3!+……+N!的值,要求定义并调用函数计算N!。
计算N!: 编写计算N阶乘的程序,数值N由键盘输入,N的值要在0到65536之间(用一个16位的字表示),结果在显示器上显示。
求n!输出1-N的阶乘.c语言,一个.cpp文件
阶乘是基斯顿·卡曼(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为止。 ...
即: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,...
众所周知,阶乘运算的增长速度特别快(比2^n的增长速度快),对于较小整数的阶乘运算采用简单的递规算法可以实现,但是对于大整数的乘法(比如1000!),则传统的递规算法就失去了作用。该程序的思路是:1.开辟一个...
功能:通过表单提交一个正整数,然后计算它的阶乘。 方法:先声明计算阶乘的方法,再调用该方法,最后在页面上输出结果。其中要对提交的是否为整数作判断,是整数则进行阶乘计算,不是整数则要求重新提交。
python算阶乘小程序 python算阶乘小程序
采用Matlab计算整数n的阶乘。子函数形式,直接调用。 采用if-else语句实现,非常方便。文档里面也有注释,方便学习。结果输出到命令窗口。
java中使用递归方法计算阶乘的代码示例
在计算N!时,由于整数N太大,则它阶乘结果就会产生溢出错误。
的值。要求定义和调用函数fact(n)计算n!,函数类型为double。 【输入形式】 从键盘输入一个正整数n。 【输入输出样例1】(下划线部分表示输入) Enter n: 3 1!=1 2!=2 3!=6 【样例说明】 输入提示符后要加一个空格...
不懂的都在里面了,自己看在不懂给我发邮箱891694742@qq.com
方法二:使用递归函数调用阶乘方法求和(其中n的值在1~40之间) def jie(n): if n == 1: return 1 else: return n*jie(n-1) n = int(input()) sum = 0 if n < 1> 40: print(请重新输入数据) else: