#include <stdio.h>
int main()
{
int n
int a[9000] //确保保存最终运算结果的数组足够大
int digit = 1 //位数
int temp //阶乘的任一元素与临时结果的某位的乘积结果
int i, j, carry //carry:进位
printf("please in put n:\n")
scanf("%d",&n)
a[0] = 1 //将结果先初始化为1
for ( i=2i<=ni++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j=1, carry=0 j<=digitj++ )
{
temp = a[j-1] * i + carry //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10 //更新临时结果的位上信息
carry = temp / 10 //看是否有进位
}
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10 //新加一位,添加信息。位数增1
carry = carry / 10 //看还能不能进位
}
}
printf("n ! = ") //显示结果
for(j = digitj >=1j--)
{
printf("%d",a[j-1])
}
printf("\n")
return 0
}
#include <stdio.h>int main()
{
int n
int a[9000] //确保保存最终运算结果的数组足够大
int digit = 1 //位数
int temp //阶乘的任一元素与临时结果的某位的乘积结果
int i, j, carry //carry:进位
printf("please in put n:\n")
scanf("%d",&n)
a[0] = 1 //将结果先初始化为1
for ( i=2 i<=n i++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j=1, carry=0 j<=digit j++ )
{
temp = a[j-1] * i + carry //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10 //更新临时结果的位上信息
carry = temp / 10 //看是否有进位
}
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10 //新加一位,添加信息。位数增1
carry = carry / 10 //看还能不能进位
}
}
printf("n ! = ") //显示结果
for(j = digit j >=1j--)
{
printf("%d",a[j-1])
}
printf("\n")
return 0
}
对于求大整数的阶乘,可以采用分段相乘的方法,其理论基础是加法的分配律,乘法的分配律。for
exmaple
:123456789*123=123*(123*10^5+56789)=123*123*10^5+123*56789;
如果我们用一个数组result[0]=56789,result[1]=123,那么123456789*123就是123*result[0]%10^6和result[1]*123+result[0]/10^6构成的一个数,另result[0]=123*result[0]%10^6,result[1]=result[1]*123+result[0]/10^6,则这个数就是result[1]result[0]
#include<stdio.h>
int
main()
{
int
n,j,i,t,p
int
result[16000]
while(scanf("%d",&n)!=EOF){
t=p=0result[0]=1
//t记录result中所存数的个数
for(j=1j<=nj++){
//n!=1*2*3*4...*n
for(i=0i<=ti++){
result[i]=result[i]*j+p
//如果sum>99999不成立,则不需进位,进位为0
p=result[i]/100000
//进位
result[i]%=100000
//数组sum中每位存5位数字
}
if(p){
//t在最高位有进位的情况下++,最高位存进位
,并让进位为0
t++
result[t]=p
p=0
}
//
如果进位不为0,
则下一次乘的时候将加上该进位,显然不合理
}
printf("%d",result[t])//先把最高位输出,因为最高位没有前导0
for(i=t-1i>=0i--)
printf("%05d",result[i])//s[i]不足5位,说明需补0
也说明result[i]在对100000取余的时候去掉了前导0,所以这里要加上
printf("\n")
}
return
0
}
刚才刚弄过一个,int数组每个元素保存四位数,10000以内的阶乘不会有问题#include <stdio.h>
#define N 10000
int main()
{
static long int r[N]={1}/*用long int 是为了保证16位编译器也正常*/
int i,j
int k=0,l=0
for(i=1i<=40i++)
{
for(j=0j<=lj++)
{
r[j]=r[j]*i+k
k=r[j]/10000
r[j]=r[j]%10000
}
if(k)
{
l++
r[j]=k
k=0
}
j=l
printf("%d!=%d",i,r[j--])
for(j>=0j--)
{
printf("%04d",r[j])
}
printf("\n")
}
return 0
}
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5040
8!=40320
9!=362880
10!=3628800
11!=39916800
12!=479001600
13!=6227020800
14!=87178291200
15!=1307674368000
16!=20922789888000
17!=355687428096000
18!=6402373705728000
19!=121645100408832000
20!=2432902008176640000
21!=51090942171709440000
22!=1124000727777607680000
23!=25852016738884976640000
24!=620448401733239439360000
25!=15511210043330985984000000
26!=403291461126605635584000000
27!=10888869450418352160768000000
28!=304888344611713860501504000000
29!=8841761993739701954543616000000
30!=265252859812191058636308480000000
31!=8222838654177922817725562880000000
32!=263130836933693530167218012160000000
33!=8683317618811886495518194401280000000
34!=295232799039604140847618609643520000000
35!=10333147966386144929666651337523200000000
36!=371993326789901217467999448150835200000000
37!=13763753091226345046315979581580902400000000
38!=523022617466601111760007224100074291200000000
39!=20397882081197443358640281739902897356800000000
40!=815915283247897734345611269596115894272000000000
请按任意键继续. . .