请问DIY题目做不来的队员:听进去了吗?去消化吸收了吗?能百度一下吗?
请问集训队员:有兴趣吗?有团队合作精神吗?有责任感吗?能坚持吗?能自主学习吗?能承受挫败吗?
HDU 1042 N! 题意:Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! (题目链接)
#include <iostream> using namespace std; //每个数组元素存放5位数 const int MAX=1000000; //%MAX后结果为[0,99999] const int N=10001; //7132+1 int a[N]={0}; void prtBig(int n) { for(int i=0; i<n;i++) { if(i==0) //最高位忽略前导0 printf("%d",a[i]); else //非最高位按5位输出 printf("%06d",a[i]); } printf("\n"); } //下面的n为引用参数,即n为实参的别名 //如此对n的改变即是对形参的改变 void mul(int &n, int k) { int c=0; //从最低位开始乘 for (int i=n-1; i>=0; i--) { int t=a[i]*k+c; a[i]=t%MAX; c=t/MAX; } if (c>0)//最后的进位放在最前面 { for(int j=n;j>0;j--) a[j]=a[j-1];//移位 a[0]=c; //进位放在最高位 n++; //n变化则形参也变 } } bool run() { int n; if(scanf("%d",&n)==EOF) return false; fill(a,a+N,0); //所有数组元素清0 a[0]=1; //0,1的阶乘为1 int m=1; //数组长度为1 for(int i=2;i<=n;i++) //从2开始乘 { mul(m, i); } prtBig(m); return true; } int main() { while(run()); return 0; }
原文地址:http://blog.csdn.net/acmerhlj/article/details/40653629