您的位置:首页 > 其它

UVA - 10061 How many zero's and how many digits ?

2016-07-13 23:05 399 查看
题目大意:给出一个十进制数 N 和一个进制 B,求 N! 在 B 进制下末尾有几个 0 和 N! 的位数。

解题思路:根据十进制求尾随零的办法,求质因数 2 和 5的对数即是尾随 0 的个数,求 N! 的质因数,算一下这些质因数相乘能凑出几个 B,即末尾有几个 0。

位数据百度用斯特林公式,对所有 i 取 logB 的和取整后 +1,注意加上 1e-9 调节精度。

#include<iostream>
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#include<cmath>
using namespace std;
int prime[10000000];
int main() {
int N, B;
while(scanf("%d%d", &N, &B) != EOF) {
memset (prime, 0, sizeof(prime));
int zero = 0, dig = 0;
for (int i = 2; i <= N; i++)
if (!prime[i]) {
prime[i]++;
for (int j = i*2; j <= N; j += i) {
prime[j] = -1;
int tmp = j;
while (tmp % i == 0) {
tmp /= i;
prime[i]++;
}
}
}
for (int i = 2, k = B; i <= N && i <= B; i++)
while (k % i == 0 && prime[i] > 0) {
prime[i]--;
k /= i;
if (k == 1) {
i = 2;
k = B;
zero++;
}
}
double sum = 0;
for (int i = 2; i <= N; i++)
sum += log(i);
dig = floor(sum / log(B) + 1e-9) + 1;
printf("%d %d\n", zero, dig);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva