N!
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
Sample Output
题目解析:
本题目是求整数的阶乘,原来意识里求阶乘是相对比较简单的问题,但是,这里 1<= N <= 10000,求得的N!是大整数。因此,需要进行“特殊”的处理。
其实,做完这道题目很高兴的,虽然过程比较纠结,对于ACM的格式以及对大整数阶乘的处理不是很熟,所以,学到了很多。
代码如下:
-
#include <stdio.h>
-
#include <string.h>
-
-
#define MAXNUM 50000 //这个最小应该多大呢?开始时开小了
-
-
int main(int argc, char* argv[])
-
{
-
int n; // 测试用例个数
-
int i, j;
-
int a[MAXNUM];
-
int digit = 0; //当前数组的大小
-
int carry = 0; //进位
-
int tmp;
-
while(scanf("%d", &n) != EOF)
-
{
-
//初始化
-
memset(a, 0, sizeof(a));
-
a[0] = 1;
-
digit = 1;
-
//把0的阶乘当作1的阶乘来处理
-
if(n == 0)
-
{
-
n = 1;
-
}
-
for(i = 1; i <= n; i++)
-
{
-
carry = 0;
-
for(j = 0; j < digit; j++)
-
{
-
tmp = a[j] * i + carry; //开始时忘记加进位carry了!!!!
-
carry = tmp / 10;
-
a[j] = tmp % 10;
-
}
-
//如果运算最后有进位,则处理进位
-
if(carry)
-
{
-
while(carry)
-
{
-
//j++; //开始这里出问题了
-
a[j] = carry % 10;
-
j++;
-
carry = carry / 10;
-
digit = j; //获取当前数组的大小
-
}
-
}
-
}
-
for(i = digit - 1; i >= 0; i--)
-
{
-
printf("%d", a[i]);
-
}
-
printf("\n");
-
}
-
-
return 0;
-
}
阅读(1326) | 评论(0) | 转发(0) |