导航:首页 > 计算方法 > 排列阶乘的计算方法

排列阶乘的计算方法

发布时间:2022-05-23 05:09:35

⑴ 谁能告诉一下阶乘的具体计算步骤,时间长了,都忘了

在《大数阶乘之计算从入门到精通-大数的表示》中,我们学习了如何表示和存储一个大数。在这篇文章中,我们将讨论如何对大数做乘法运算,并给出一个可以求出一个大整数阶乘的所有有效数字的程序。
大整数的存储和表示已经在上一篇文章做了详细的介绍。其中最简单的表示法是:大数用一个字符型数组来表示,数组的每一个元素表示一位十进制数字,高位在前,低位在后。那么,用这种表示法,如何做乘法运算呢?其实这个问题并不困难,可以使用模拟手算的方法来实现。回忆一下我们在小学时,是如何做一位数乘以多位数的乘法运算的。例如:2234*8。

我们将被乘数表示为一个数组A[], a[1],a[2],a[3],a[4]分别为2,2,3,4,a[0]置为0。

Step1: 从被乘数的个位a[4]起,取出一个数字4.
Step2: 与乘数8相乘,其积是两位数32,其个位数2作为结果的个位,存入a[4], 十位数3存入进位c。
Step3: 取被乘数的上一位数字a[3]与乘数相乘,并加上上一步计算过程的进位C,得到27,将这个数的个位7作为结果的倒数第二位,存入a[3],十位数2存入进位c。
Step4:重复Step3,取a[i](i依次为4,3,2,1)与乘数相乘并加上c,其个位仍存入a[i],十位数字存入c,直到i等于1为止。
Step5:将最后一步的进位c作为积的最高位a[0]。

这一过程其实和小学学过的多位数乘以一位数的珠算乘法一模一样,学过珠算乘法的朋友还有印象吗?

在计算大数阶乘的过程中,乘数一般不是一位数字,那么如何计算呢?我们可以稍作变通,将上次的进位加上本次的积得到数P,将P除以10的余数做为结果的本位,将P除以10的商作为进位。当被乘数的所有数字都和乘数相乘完毕后,将进位C放在积的最前面即可。下面给出C语言代码。
一个m位数乘以n位数,其结果为m+n-1,或者m+n位,所以需首先定义一个至少m+n个元素的数组,并置前n位为0。

计算一个m位的被乘数乘以一个n位的整数k,积仍存储于数组a

[cpp] view plainprint?
01.void mul(unsigned char a[],unsigned long k,int m,int n)
02.{
03. int i;
04. unsigned long p;
05. unsigned long c=0;
06.
07. for ( i=m+n-1; i>=n;i--)
08. {
09. p= a[i] * k +c;
10. a[i]=(unsigned char)( p % 10);
11. c= p / 10;
12. }
13.
14. while (c>0)
15. {
16. a[i]=(unsigned char)( c % 10);
17. i--;
18. c /=10;
19. }
20.}
21.
22.int main(int argc, char* argv[])
23.{
24. int i;
25. unsigned char a[]={0,0,0,2,3,4,5};
26. mul(a,678,4,3);
27. i=0;
28. while ( a[i]==0)
29. i++;
30. for (;i<4+3;i++)
31. printf("%c",a[i]+’0’); //由于数a[i](0<=a[i] <=9)对应的可打印字任符为’0’到’9’,所以显示为i+’0’
32. return 0;
33.}
void mul(unsigned char a[],unsigned long k,int m,int n)
{
int i;
unsigned long p;
unsigned long c=0;

for ( i=m+n-1; i>=n;i--)
{
p= a[i] * k +c;
a[i]=(unsigned char)( p % 10);
c= p / 10;
}

while (c>0)
{
a[i]=(unsigned char)( c % 10);
i--;
c /=10;
}
}

int main(int argc, char* argv[])
{
int i;
unsigned char a[]={0,0,0,2,3,4,5};
mul(a,678,4,3);
i=0;
while ( a[i]==0)
i++;
for (;i<4+3;i++)
printf("%c",a[i]+’0’); //由于数a[i](0<=a[i] <=9)对应的可打印字任符为’0’到’9’,所以显示为i+’0’
return 0;
}

从上面的例子可知,在做乘法之前,必须为数组保留足够的空间。具体到计算n!的阶乘时,必须准备一个能容纳的n!的所有位数的数组或者内存块。即数组采有静态分配或者动态分配。前者代码简洁,但只适应于n小于一个固定的值,后者灵活性强,只要有足够的内存,可计算任意n的阶乘,我们这里讨论后一种情况,如何分配一块大小合适的内存。

n!有多少位数呢?我们给出一个近似的上限值:n! <(n+1)/2的n次方,下面是推导过程。
Caes 1: n是奇数,则中间的那个数mid= (n+1)/2, 除了这个数外,我们可以将1到n之间的数分成n/2组,每组的两个数为 mid-i和mid+i (i=1到mid-1),如1,2,3,4,5,6,7 可以分为数4,和3对数,它们是(3,5),(2,6)和(1,7),容易知道,每对数的积都于小mid*mid,故n!小于(n+1)/2 的n的次方。

Case 2: n 是个偶数,则中间的两个数(n-1)/2和(n+1)/2, 我们将(n+1)/2记做mid,则其它的几对数是(mid-2,mid+1),(mid-3)(mid+2)等等,容易看出,n!小于mid 的n次方。
由以上两种情况可知,对于任意大于1的正整数n, n!<(n+1)/2的n次方。
如果想求出n!更准确的上限,可以使用司特林公式,参见该系列文章《阶乘之计算从入门到精通-近似计算之二》。

到此,我们已经解决大数阶乘之计算的主要难题,到了该写出一个完整程序的时候了,下面给出一个完整的代码。

[cpp] view plainprint?
01.#include "stdio.h"
02.#include "stdlib.h"
03.#include "memory.h"
04.#include "math.h"
05.#include "malloc.h"
06.
07.void calcFac(unsigned long n)
08.{
09. unsigned long i,j,head,tail;
10. int blkLen=(int)(n*log10((n+1)/2)); //计算n!有数数字的个数
11. blkLen+=4; //保险起见,多加4位
12.
13. if (n<=1)
14. { printf("%d!=0/n",n); return;}
15.
16. char *arr=(char *)malloc(blkLen);
17. if (arr==NULL)
18. { printf("alloc memory fail/n"); return ;}
19.
20. memset(arr,0,sizeof(char)*blkLen);
21. head=tail=blkLen-1;
22. arr[tail]=1;
23.
24. for (i=2;i<=n;i++)
25. {
26. unsigned long c=0;
27. for (j=tail;j>=head;j--)
28. {
29. unsigned long prod=arr[j] * i +c;
30. arr[j]=(char)( prod % 10);
31. c= prod / 10;
32. }
33. while (c>0)
34. {
35. head--;
36. arr[head]=(char)(c % 10);
37. c/=10;
38. }
39. }
40. printf("%d!=",n);
41. for (i=head;i<=tail;i++)
42. printf("%c",arr[i]+'0');
43. printf("/n");
44.
45. free(arr);
46.}
47.
48.void testCalcFac()
49.{
50. int n;
51. while (1)
52. {
53. printf("n=?");
54. scanf("%ld",&n);
55. if (n==0)
56. break;
57. calcFac(n);
58. }
59.}
60.
61.int main(int argc, char* argv[])
62.{
63. testCalcFac();
64. return 0;
65.}

⑵ 阶乘怎么算啊

如果要精确计算阶乘,阶乘没有什么简便方法,只能一个一个的往下乘。
这也是为何要专门用一个!来表示阶乘。
如果只想计算大概的值,可以用“
斯特林公式”
(请自行网络)。
其实想想也很自然,
100!=1x2x3x...x10x11x12x...x20x21x...x99x100,
从10以后,每乘一次,这个数就至少增加一位,所以这个数就是写出来,也至少是100位左右的数字,假设有的话,这个公式该多复杂。

⑶ 阶乘的计算方法

n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

亦即n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

资料来源:阶乘_网络

⑷ 排列组合的算法和阶乘的公式

从5个不同的小球里任取三个,共有多少种取法?
属于组合问题,C(3,5)=(5*4*3)/(3*2*1)=10种
从数字1、2、3、4、5中任取三个数组成一个新的三位数,共可组成多少个不同的三位数?
属于排列问题,方法一,P(3,5)=5*4*3=60个
方法二,C(3,5)*P(3,3)=10*6=60个
“!”表示阶乘,5!=5*4*3*2*1=120,3!=3*2*1=6

⑸ 阶乘公式是什么呢

阶乘的主要公式:

1、任何大于1的自然数n阶乘表示方法。

n!=1×2×3×……×n或n!=n×(n-1)!

2、n的双阶乘:当n为奇数时表示不大于n的所有奇数的乘积。

如:7!=1×3×5×7

3、当n为偶数时表示不大于n的所有偶数的乘积(除0外)。

如:8!=2×4×6×8

4、小于0的整数-n的阶乘表示。

(-n)!=1 / (n+1)!

5、0的阶乘。

0!=0

阶乘计算方法:

正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。

例如所要求的数是6,则阶乘式是1×2×3×……×6,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是1×2×3×……×n,设得到的积是x,x就是n的阶乘。

⑹ 阶乘的主要公式

阶乘的主要公式:

(6)排列阶乘的计算方法扩展阅读:

阶乘(factorial)是基斯顿·卡曼(Christian Kramp, 1760 – 1826)于1808年发明的运算符号。阶乘,也是数学里的一种术语。阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。

另外,数学家定义,0!=1,所以0!=1!通常我们所说的阶乘是定义在自然数范围里的,小数没有阶乘,像0.5!,0.65!,0.777!都是错误的。

但是,有时候我们会将Gamma函数定义为非整数的阶乘,因为当x是正整数n的时候,Gamma函数的值是n-1的阶乘。



⑺ 数学排列组合的阶乘形式的推导过程

排列公式是建立一个模型,从n个不相同元素中取出m个排成一列(有序),第一个位置可以有n个选择,第二个位置可以有n-1个选择(已经有1个放在前一个位置),则同理可知第三个位置可以有n-2个选择,以此类推第m个位置可以有n-m+1个选择,则排列数A(n
m)=n*(n-1)*(n-2)...*(n-m+1)
由阶乘的定义可知A(n
m)=[n*(n-1)*(n-2)...*(n-m+1)]*[(n-m)*(n-m-1)...*1]/[(n-m)*(n-m-1)...*1]
上下合并可得A(n
m)=n!/(n-m)!
组合公式对应另一个模型,取出m个成为一组(无序),可以先考虑排列A(n
m),由于m个元素组成的一组可以有m!种不同的排列(全排列A(m
m)=m!),所以组合的总数就是A(n
m)/m!
即为C(n
m)=A(n
m)/m!=n!/[m!*(n-m)!]

⑻ 排列组合公式计算公式是什么

排列组合公式计算公式大全如下所示。

1、排列及计算公式

从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号p(n,m)表示。p(n,m)=n(n-1)(n-2)…(n-m+1)= n!/(n-m)!(规定0!=1)。

2、组合及计算公式

从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。

用符号c(n,m)表示,c(n,m)=p(n,m)/m!=n!/((n-m)!*m!),c(n,m)=c(n,n-m)。

3.其他排列与组合公式

从n个元素中取出r个元素的循环排列数=p(n,r)/r=n!/r(n-r)!。n个元素被分成k类,每类的个数分别是n1,n2,...nk这n个元素的全排列数为n!/(n1!*n2!*...*nk!)。k类元素,每类的个数无限,从中取出m个元素的组合数为c(m+k-1,m)。排列(Pnm(n为下标,m为上标))

Pnm=n×(n-1)-(n-m+1);Pnm=n!/(n-m)!(注:!是阶乘符号);Pnn(两个n分别为上标和下标)=n!;0!=1。

Pn1(n为下标1为上标)=n组合(Cnm(n为下标,m为上标))Cnm=Pnm/Pmm;Cnm=n!/m!(n-m)!;Cnn(两个n分别为上标和下标)=1;Cn1(n为下标1为上标)=n;Cnm=Cnn-m。

⑼ 阶乘的公式是什么

公式:n!=n*(n-1)!
阶乘的计算方法
阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。
例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。
例如所要求的数是6,则阶乘式是1×2×3×..×6,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是1×2×3×…×n,设得到的积是x,x就是n的阶乘。
阶乘的表示方法
在表达阶乘时,就使用“!”来表示。如x的阶乘,就表示为x!
他的原理就是反推,如,举例,求10的阶乘=10*9的阶乘(以后用!表示阶乘)那么9!=?,9!=9*8!,8!=8*7!,7!=7*6!,6!=6*5!,5!=5*4!,4!=4*3!,
3!=3*2!,2!=2*1!,1的阶乘是多少呢?是1
1!=1*1,数学家规定,0!=1,所以0!=1!然后在往前推算,公式为n!(n!为当前数所求的阶乘)=n(当前数)*(n-1)!(比他少一的一个数n-1的阶乘把公式列出来像后推,只有1的!为1,所以要从1开始,要知道3!要知道2!就要知道1!但必须从1!开始推算所以要像后推,如果遍程序算法可以此公式用一个函数解决,并且嵌套调用次函数,,)把数带入公式为,
1!=1*1
2!=2*1(1!)
3!=3*2(2!)
4=4*6(3!),如果要是编程,怎么解决公式问题呢
首先定义算法
//算法,1,定义函数,求阶乘,定义函数fun,参数值n,(#include
long
fun(int
n
)
//long
为长整型,因20!就很大了超过了兆亿
(数学家定义数学家定义,0!=1,所以0!=1!,0与1的阶乘没有实际意义)
2,函数体判断,如果这个数大于1,则执行if(n>1)(往回退算,这个数是10求它!,要从2的阶乘值开始,所以执行公式的次数定义为9,特别需要注意的是此处,当前第一次写入代码执行,已经算一次)
求这个数的n阶乘(公式为,n!=n*(n-1)!,并且反回一个值,
return
(n*(fun(n-1));(这个公式为,首先这个公式求的是10的阶乘,但是求10的阶乘就需要,9的阶乘,9的阶乘我们不知道,所以就把10减1,也就是n-1做为一个新的阶乘,从新调用fun函数,求它的阶乘然后在把这个值返回到
fun(n-1),然后执行n*它返回的值,其实这个公式就是调用fun函数的结果,函数值为return
返回的值,(n-1)为参数依次类推,...一值嵌套调用fun函数,
到把n-1的值=1,
注意:此时已经运行9次fun()函数算第一次运行,,调用几次fun函数呢?8次函数,所以,n-1执行了9次,n-1=1
,n=2已经调用就可以求2乘阶值

阅读全文

与排列阶乘的计算方法相关的资料

热点内容
朗逸空调清洗方法视频 浏览:266
屋顶坡度的形成方法有哪些 浏览:540
有什么可以减双下巴的方法 浏览:327
气动减震器漏气检测方法 浏览:907
登山杖使用方法图 浏览:729
皮肤发黑快速恢复方法 浏览:237
用什么方法解题最好 浏览:965
登录微信的第二种方法该如何操作 浏览:999
解方程方法与步骤四年级 浏览:764
触宝拨号键在哪里设置方法 浏览:636
买手套掌围测量方法 浏览:810
接发球的技巧和训练方法 浏览:150
感冒了最有效的治疗方法 浏览:641
什么方法祛斑效果又快又好 浏览:657
全站仪高差测量方法 浏览:543
有什么治痔疮的土方法 浏览:17
汽车暖风水箱堵塞的解决方法 浏览:264
小型潜水泵的安装方法 浏览:413
使用肥皂洗衣服的正确方法技巧 浏览:290
解决浑身没劲的特效方法 浏览:98