代码改变世界

杭电HDU_1042

2015-04-26 15:47  HaodongGUO  阅读(84)  评论(0编辑  收藏  举报

ps:刚才重打了这段代码,之前的有错

#include <iostream>
#include<cstdio>

using namespace std;
#define MAX 10000
#define BASE 100000//基度可以选不同的值 ,eg:80000 
int h[MAX];//10000大小的数组 


int main()
{
    int i,j,k,carry;
    int n;

    while(scanf("%d",&n)!=EOF)
    {
        memset(h,0,MAX*sizeof(int));
        h[0]=1;//第一个数标记为1,当输入为0,和1时,输出此值
        
		for(i=2;i<=n;i++)
		{
			carry=0;//表示进位
			//将阶乘存到数组中,如果是0,1,将会跳过这一步
			 
			for(k=0;k<MAX;k++)//遍历所开数组的每一个数进行进位以及数的保存
			{
				carry=carry+i*h[k];
				h[k]=carry%BASE;//将该位未进位的数保存 
				carry=carry/BASE;//将进位的数保存 
			}
		}
			//打印数组 
			for(j=MAX-1;j>=0;j--)
			{
				if(h[j]) 
				{
					break;
				}
			}
			
			printf("%d",h[j]);
			
			for(i=j-1;i>=0;i--)//当输入为0,1时,跳过此for循环
			{
				printf("%05d",h[i]);
			}
	printf("\n");
	
	} 
		 return 0;
}