大数阶乘,C语言,数组
Posted 志大牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数阶乘,C语言,数组相关的知识,希望对你有一定的参考价值。
一、我们都知道int类型存储不了12以后的阶乘,在c语言里。而double类型,会存在很大的误差。所以我们可以考虑用数组来存储大数阶乘。(你也可以直接看代码,里面我也写了很清楚的注释)
二、阶乘,大家都很明白。
1!==1;
2!==1*2;
3!==1*2*3;
4!==1*2*3*4;
5!==1*2*3*4*5;
Firstly,a[0]直接赋值,为1的阶乘。不然for循环不好处理;现在a[0]为1,为一位数;
一直到3!都为一位数,我们就按照一位数来存。即,a[0]*2==2!,a[0]*3==3!
Secondly,当4!时,有两位数了,现在a[0]里是6,即a[0]*4==4!(4*6==24)。我们如何将4取出来存在a[0]中呢,24%10==4即可。但此时,多出一位数,我们便把它存在a[1]中。a[1]里我们要存数字2,如何得到数字2呢,24/10==2即可,后面的位数以此类推。
说实话,我思维不好,所以也是看了半天才看明白,所以在这里直接给大家上代码,哈哈哈哈哈
#include<stdio.h>
int main()
int i, n, j;
int digit = 1;//位数的计数器,我们需要知道存在数组里时,有多少位数
int num = 0;//数学乘法里进位数,如:12*6,个位为2,进位数为1;
int temp = 0;//每一位数相乘后的结果,如:上面个位相乘后为12,则temp=12;
int a[20001] = 0 ;//可以存200001个数字,已经很大了
a[0] = 1;//a【0】,也就是1的阶乘,需要自己赋值,不然不好存
scanf("%d", &n);
for (i = 2; i <= n; i++)//这个控制算数字的阶乘,i为几,即算的是几的阶乘
num=0;
for (j = 0; j < digit; j++)//这个for循环,则是控制每一位数的存储。
temp = a[j] * i + num;
a[j] = temp % 10;
num = temp / 10;
while (num)//当然,num==0时,不需要进位;
a[digit] = num%10;//由于上面for循环里,位数没有包括当前位数,所以在这里存储,当num为两位数时,我们只要十位上的数字存在这里
num = num / 10;//退出循环
digit++;//既然进了循环,则表明位数多了一位,则加1;
for (i = digit-1; i >=0; i--)//因为我们存的数是和原来的数相反的,所以倒序输出,就OK了
printf("%d", a[i]);
printf("\\n");
return 0;
谢谢。
以上是关于大数阶乘,C语言,数组的主要内容,如果未能解决你的问题,请参考以下文章