首页 > 代码库 > HDU 1042 N! 参考代码

HDU 1042 N! 参考代码

请问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;
}


HDU 1042 N! 参考代码