48 求N!

48 求N!

作者: xxx时间限制: 1S章节: 一维数组

问题描述 :

给你一个整数N(0 ≤ N ≤ 10000),你的任务是计算并输出 N!

输入说明 :

输入多行,每行一个N。

输出说明 :

对于每个输入N,在一行中输出N!

行首与行尾为空格,两组输出之间无空行。

输入范例 :

2
1
100

输出范例 :

2
1
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

 

解题思路:很明显这一道题目是大数运算,具体方法见:大数四则运算。刚开始算阶乘采用递归,但是程序总是莫名中止,后来想到递归调用栈肯定会溢出,随即采用for循环求解。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include <string.h>
 5 #include <ctype.h>
 6 
 7 #define maxn 5000
 8 #define newline printf("\n")
 9 
10 
11 
12 typedef struct bign{
13     int d[maxn];
14     int len;
15 }bign;
16 
17 bign c;
18 bign b;
19 bign sum;
20 
21 
22 
23 bign multi(bign a,int x);
24 void myPrint(bign a);
25 
26 int main(){
27     
28     c.len = 0;
29     b.len = 0;    
30     int n;
31     int i;
32     while(scanf("%d",&n)!=EOF){
33             sum.len=1;
34             sum.d[0] = 1;
35         for(i=1;i<=n;i++){
36             sum = multi(sum,i);
37         }
38         myPrint(sum);
39     }
40 
41 
42     return 0;
43 }
44 
45 bign multi(bign a,int x){
46 
47     c.len = 0;
48 
49     int i;
50     int carry = 0;
51     for(i=0;i<a.len;i++){
52         int temp = x*a.d[i]+carry;
53         c.d[c.len++] = temp%10;
54         carry = temp/10;
55     }
56     while(carry){
57         c.d[c.len++] = carry%10;
58         carry = carry/10;
59     }
60     return c;
61 }
62 
63 void myPrint(bign a){
64     int i;
65     for(i=a.len-1;i>=0;i--){
66         printf("%d",a.d[i]);
67     }
68     newline;
69 }

 

 

posted @ 2020-03-28 13:19  focusDing  阅读(210)  评论(0编辑  收藏  举报