hdu1042(大数压位)

给定整数 N (0 ≤ N ≤ 10000),你的任务是计算 N! 。
输入
每行一个整数 N,处理到文件结束为止。
输出
对于每个 N,输出一行,包含 N! 的计算结果。
示例输入
0
1
2
3
示例输出
1
1
2
6

显然10000的阶乘是一个超大的数
这里记录一种储存大数的办法,压位法
其实就是把十进制改成所要的进制,比如压4位,就变成了1e4次方进制了,其他按正常的乘法计算就行了,如123451234,那12345就可以变成110000+23451,1234=12341,然后12342345=n,11234=m,那新成的数就等于(m+n/10000)*10000+n%10000了,就跟十进制的做法是一样的
输出的时候除了最高位还需要在每一个数前补零补满四位(压几位补到几位)
这道题我直接压9位了,省了很多倍时间
ac代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// 1010101 > sqrt(1e12)
const int N=1e9;
long long int p[10000];
void asd(int x)
{
	
	memset(p,0,sizeof(p));
	p[0]=1;
	int k=0,j;
	for(int i=1;i<=x;i++)
	{
		p[0]=p[0]*i; 
		for(j=0;j<=k;j++)
		{
			p[j+1]=p[j+1]*i+p[j]/N;
			p[j]=p[j]%N;
		}
		if(p[k+1]>0){
			k++;
	}
}
	printf("%lld",p[k]);
	for(int i=k-1;i>=0;i--)
	printf("%09d",p[i]);
	printf("\n");
	
}
int main()
{
	int a;
while(~scanf("%d",&a))
	{
		asd(a) ;
	}
}在这里插入代码片
发布了109 篇原创文章 · 获赞 35 · 访问量 6031

猜你喜欢

转载自blog.csdn.net/weixin_43965698/article/details/88957740