48 求N!
48 求N!
作者:
问题描述 :
给你一个整数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 }