Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1 2 3
Sample Output
1 2 6
SOLU 1.
求大数的阶乘(10000以内) 要求: 需要知道阶乘结果的位数,直接对每一位乘以整个较大数, mod 10 , 10,来进位 #include<iostream> #include<cstring> using namespace std; #define MAX_LEN 40000 int main() { int f[40010]; int n; while(cin>>n) { memset(f,0,sizeof(f)); f[0]=1; //初始f[0]为1; for(int i=2;i<=n;i++) { int c=0; //变量c存储进位,每一次乘法都要令为0; for(int j=0;j<MAX_LEN;j++) //每一次乘法都要对存储的每一位计算, { //并且是每一位都是拿整个大数来乘 int s=f[j]*i+c; f[j]=s%10; //取余 c=s/10; //进位 } //不用处理最高进位 } int i=MAX_LEN-1; while(f[i]==0) //前导输出 i--; for(;i>=0;i--) cout<<f[i]; cout<<endl; } return 0; }
SOLU 2.
#include <stdio.h> #include <string.h> /* 一个数组元素表示 4 个十进制位,即数组是万进制的 */ #define BIG_RADIX 10000 #define RADIX_LEN 4 /* 10000! 有 35660 位 */ #define MAX_LEN (35660/RADIX_LEN + 1) int x[MAX_LEN + 1]; void Big_Print() { int i; int start_output = 0;//用于跳过多余的0 for (i = MAX_LEN; i >= 0; --i) { if (start_output == 1) {//如果多余的0已经跳过,则输出 printf("%04d", x[i]); } else if (x[i] > 0) {//表示多余的0已经跳过 printf("%d", x[i]); start_output = 1; } } if (start_output == 0)//如果全为0 printf("0"); } void Big_Multiple(int y) { int i; int carry = 0;//保存进位 int tmp; for (i = 0; i < MAX_LEN; ++i) { tmp = x[i] * y + carry; x[i] = tmp % BIG_RADIX; carry = tmp / BIG_RADIX; } } void Big_Factorial(int N) { int i; memset(x, 0, sizeof(x)); x[0] = 1; for (i = 2; i <= N; ++i) { Big_Multiple(i); } } int main(void){ int N; while (scanf("%d", &N) != EOF) { Big_Factorial(N); Big_Print(); printf(" "); } }