题目如下:
Description |
||
请求N!(N<=10000),输出结果对10007取余 |
||
Sample Input |
||
1 2 -1 |
||
Sample Output |
||
1 2 |
分析思路:
题目思路很简单,每读取一个输入就输出对应输入的阶乘。直到遇到输入为-1时结束程序。
核心问题:
这个题目在写的时候遇到的难点是N!实在是太大了,根本储存不下,之后试了long long int 也还是只能储存到20几就会溢出。解决这个问题的核心通过查询资料后找到了“同余定理”。
同余定理:在本题中就是,(N!)%10007 = [(N%10007)*((N-1)%10007)*((N-2)%10007)……]%10007
百度百科-同余定理:【http://baike.baidu.com/link?url=5wSVwGsN3xHBzF638XMHQ3f2UbjwcKEgjjxvL_aA4sqfgtlV73FP6ExftXGeohPEVQ_wksMDNrGtAlCGobwo602y2_o4r04gYMrRvh9cvpT40m3z-Go6PhYCKqUSYIQ7】
最后附上我的程序源码:
#include <stdio.h> int main () { int n; while (n!=EOF) { int sum = 1; scanf ("%d",&n); if (n==-1) break; for (;n>0;n--) { sum = sum*n%10007; } printf ("%d ",sum); } return 0; }
2016-10-18