找N!最后一个非零的数字

#include <iostream>
int digits[10];

long long power(long long a, long long b)
{
	if(b == 0)
		return 1;
	else if(b == 1)
		return a;
	long long temp = power(a, b/2);
	if(b%2)
		return a*temp*temp;
	else
		return temp*temp;
}

int get5(int n)
{
	if (n == 0)
		return 0;
	return n/5 + get5(n/5);
}

int get2(int n)
{
	if(n == 0)
		return 0;
	return n/2 + get2(n/2);
}

int g(int x, int n)
{
	if (n == 0)
		return 0;
	return n/10+(n%10>=x)+g(x, n/5);
}

int getx(int x, int n)
{
	if(n == 0)
		return 0;
	return getx(x, n/2) + g(x, n);
}

int hash[4][4] ={
	{6, 2, 4, 8},
	{1,3,9,7},
	{1,7,9,3},
	{1,9,1,9}
};
int main()
{
	int N, M;
	while(scanf("%d%d", &N, &M) != EOF)
	{
		memset(digits, 0, sizeof(digits));
		digits[2] = get2(N)-get2(N-M);
		digits[5] = get5(N)-get5(N-M);
		digits[3] = getx(3, N)-getx(3, N-M);
		digits[7] = getx(7, N)-getx(7, N-M);
		digits[9] = getx(9, N)-getx(9, N-M);
		if (digits[5] > digits[2])
		{
			printf("5/n");
			continue;
		}
		else
		{
			int ret = 1;
			if (digits[5] != digits[2])
			{
				ret *= hash[0][(digits[2]-digits[5])%4];
				ret %= 10;
			}
			ret *= hash[1][digits[3]%4];
			ret %= 10;

			ret *= hash[2][digits[7]%4];
			ret %= 10;

			ret *= hash[3][digits[9]%4];
			ret %= 10;

			printf("%d/n", ret);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值