C语言大数阶乘运算

求一份计算大数阶乘的代码从1!一直算到40!不需要相加输出的时候是1!=%d\n2!=%d\n……40!=%d\n每一位数用一个数组元素存储跪求代码鼓捣一天没鼓捣出来请用... 求一份计算大数阶乘的代码 从1!一直算到40!不需要相加 输出的时候 是1! = %d\n 2! = %d\n …… 40! = %d\n 每一位数用一个数组元素存储 跪求代码 鼓捣一天没鼓捣出来 请用C代码 求大神指教 展开
 我来答
adoqq_bd
推荐于2017-11-25 · TA获得超过7051个赞
知道大有可为答主
回答量:1818
采纳率:63%
帮助的人:1670万
展开全部
刚才刚弄过一个,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=1;i<=40;i++)
{
for(j=0;j<=l;j++)
{
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>=0;j--)
{
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
请按任意键继续. . .
追问
原理求教 怎样才可以用一个数组元素存储一位大数数字?
追答
就是模拟手工算法
这个是一个元素一位的算法:
#include
#define N 10000
int main()
{
static long int r[N]={1};
int i,j;
int k=0,l=0;
for(i=1;il)
l=j;
r[j++]+=k%10;
k=k/10;
}
j=l;
for(;j>=0;j--)
{
printf("%d",r[j]);
}
printf("\n");
}
return 0;
}
看灰过来了
2012-05-17 · TA获得超过879个赞
知道小有建树答主
回答量:508
采纳率:83%
帮助的人:305万
展开全部
#include<stdio.h>
int main()
{
double a[40],s=1;
int i;

for(i=0;i<40;i++)
a[i]=i+1;//存放1到40

for(i=0;i<40;i++)
{ s=s*a[i];
printf("%d!=%.0f ",i+1,s); //i是下标,但数组中咱们放的时候是下标为i的元素存的是i+1
}
return 0;
}
更多追问追答
追问
正解是40! = 815915283247987734345611269596115894272000000000  代码运行结果不对的
追答
代码运行结果能保证你前15位或者16位正确,因为double型数据的有效范围是15到16位有效数字,其他位上的就不敢保证了,这也是为什么c语言中说不是所有的浮点型数据都能准确无误的输出,而此处之所以用double型,是因为你求的阶乘太大,其他类型的,恐怕表示不了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hwy_2000
2012-05-18 · TA获得超过170个赞
知道小有建树答主
回答量:152
采纳率:100%
帮助的人:89.1万
展开全部
2012-5-17 23:39 adoqq_bd 方法改进

#include <stdio.h>
#define N 10000
int main()
{
static long int r[N]={1};
int i,j;
int k=0,l=0;
for(i=1;i<=40;i++)
{
for(j=0;j<=l;j++)
{
k=r[j]*i+k;
r[j]=k%10;
k=k/10;
if( (j==l)&&k) l++;
}
j=l;
for(;j>=0;j--)
{
printf("%d",r[j]);
}
printf("\n");
}
return 0;
}
每个元素储存一位算得太慢,也太占空间。如果需要算更大的数,可以参考http://zhidao.baidu.com/question/421377552.html
追问
要求就是一个元素存储一位数  没办法
追答
前面的方法是一个元素存储一位数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xoalyg
2012-05-17 · TA获得超过4178个赞
知道大有可为答主
回答量:2356
采纳率:100%
帮助的人:2419万
展开全部
/*
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! = 1124000727777607700000
23! = 25852016738884978000000
24! = 620448401733239410000000
25! = 15511210043330986000000000
26! = 403291461126605650000000000
27! = 10888869450418352000000000000
28! = 304888344611713840000000000000
29! = 8841761993739700800000000000000
30! = 265252859812191030000000000000000
31! = 8222838654177922400000000000000000
32! = 263130836933693520000000000000000000
33! = 8683317618811885900000000000000000000
34! = 295232799039604120000000000000000000000
35! = 10333147966386144000000000000000000000000
36! = 371993326789901180000000000000000000000000
37! = 13763753091226343000000000000000000000000000
38! = 523022617466601040000000000000000000000000000
39! = 20397882081197442000000000000000000000000000000
40! = 815915283247897680000000000000000000000000000000
请按任意键继续. . .
*/
#include <stdio.h>

double fact(int n) {
double product = 1.0;
int i;
if(i < 0) return 0.0;
if((n == 0) || (n == 1)) return 1.0;
for(i = 2; i <= n; ++i) product *= i;
return product;
}

int main() {
int i;
for(i = 1; i <= 40; ++i)
printf("%d! = %.0lf\n",i,fact(i));
return 0;
}
追问
正解是40! = 815915283247987734345611269596115894272000000000  代码运行结果不对的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式