N!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 61418 Accepted Submission(s): 17526
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
Author
JGShining(极光炫影)
1,该题要用到高精度乘法,最后要注意一下10000!有3万多位(我也是网上看到的) 第一次我只用了3000位,然后就RE了。
2,个人觉得比较难的地方在于对于高精度乘法的理解以及对进位的处理;
3,这个算法还不是最简单的,HDUOJ上用了2100MS,然后我居然还看到了有人900多MS就AC了,有时间还得研究一下;
4,高精度乘法———-把一个数按位数存在一个数组中,用另外一个数乘以数组中的每一个元素,循环一遍后,再在扫描一遍把所有大于9的元素全部向后进位。这个题注意对数组中最大位数的进行标记,用于下一次循环。
5,一开始看到这个题目觉得很难,跳了过去,结果今天用了不到一小时就写出来了—在没有仔细思考前不能轻易下定论。
2015.04.05追加:
6:刚刚在复制之前的那份代码发现没法运行,检查了一遍,发现第一次写这篇时自作聪明把while(1)语句和最后一个if语和到一起了,结果就运行不了了,所以还是要充分理解代码啊。bug已改。。。
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int N,k,flag = 0;
while(~scanf("%d",&N))
{
int sum[40000] = {1};
flag = 0;
if(N == 1 ||N == 0)//1,0排掉
{
cout << "1" << endl;
continue;
}
else
for(int i = 2 ; i <= N; i++)//从2开始相乘
{
for (k = 0; k <= flag ; k++)//令i分别于数组里面的每一位数相乘
{
sum[k] *= i;
}
k = 0 ;
while(1)
{
if (sum[k] > 9)
{
sum[k+1] += sum[k] /10;
sum[k] %= 10;
}
k++;
if(k > flag && sum[k] ==0) break;//循环结束标志:当数据的最大位数超过上一次数据的位数,即进位完成,用do-while语句也行,但不能先判断在进位。应该先进位在判断---2015.04.05
}
flag = k-1;
}
for(k = flag; k >=0 ; k--)//倒输
cout << sum[k] ;
cout << endl;
}
return 0;
}

836

被折叠的 条评论
为什么被折叠?



