uva 10061(数学)

题解:题目要在b进制下输出的是一个数字阶乘后有多少个零,然后输出一共有多少位。首先计算位数,log(n)/log(b) + 1就是n在b进制下有多少位,而log有个公式就是log(M×N) = logM + logN,n! 的位数用公式可以化为( log(1) + log(2) +...+log(n) ) / log(b) + 1,为了精确再加 10^-6。阶乘后的零的数量计算是根据进制数的最大质因数和其数量 确定的,比如10 = 2 × 5,所以10进制的最大质因数是5,数量是num = 1,例如100!中的所有因子除五,能分解出来因子5的数量的和再除num就得到了后导0的数量24。
#include <cstdio>
#include <cmath>
using namespace std;

int find(int n, int b) {
	int max = -1;//寻找最大质因数
	int flag1 = 1;//最大质因数数量
	for (int i = 2; i <= b; i++) {
		while (b % i == 0) {
			b = b / i;
			if (max < i) {
				max = i;
				flag1 = 1;
			}
			else if (max == i)
				flag1++;
		}
	}
	int flag2 = 0;//能分解出来的最大质因数的数量
	int temp;
	for (int i = 1; i <= n; i++) {
		temp = i;
		while (temp % max == 0) {
			temp /= max;
			flag2++;
		}
	}
	flag2 = flag2 / flag1;
	return flag2;
}

int main() {
	int n;
	int b, flag, len;
	double l;
	while (scanf("%d%d", &n, &b) != EOF) {
		flag = l = 0;
		for (int i = 1; i <= n; i++)
			l += log(i);
		len = l / log(b) + 1e-6;
		flag = find(n, b);
		printf("%d %d\n", flag, len + 1);
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值