题目:10061 - How many zero's and how many digits ?
题目大意:求N!在bas进制下的位数和后面的0;
解题思路:分两步,一步是求位数,在十进制的情况下:下取整log10(n) + 1,就是求数n的位数;例如log10(10)是1,但是十是两位数,所以加1。因为log10(a*b)= log10(a)+log10(b);所以求N!的位数可以是sum(log10(i))(1<= i<= n );下取整的话可以用floor(sum),也可以用int(sum)(在sum>=0 的情况下)。
第二步:求后面的零,思路是现将N!分解成不大于bas的质因数,因为 大于bas的质因数肯定不能组成bas,而只有组成bas,才会有0产生。例如在十进制下,2 * 5 = 10,这样就会产生一个0 在末尾。所以要给一个数组来存放质因数。然后要将质因数组合成bas。组成一个bas就产生一个零。
#include<stdio.h>
#include<string.h>
#include<math.h>
int n, d;
const int N = 10000;
int s[N];
int zero_num() {
int i, j;
for(i = 2; i <= n; i++) {
int k = i;
for(j = 2; j <= k && j <= d ; j++)
while(k % j == 0) {
s[j]++;
k /= j;
}
}
int count = 0, bas = d;
for(i = 2; i <= d; i++) {
if(s[i]) {
if(bas % i == 0) {
s[i]--;
bas /= i;
i--;
}
if(bas == 1 ) {
count++;
bas = d;
i = 1;
}
}
}
return count;
}
int dight_num() {
double sum = 0;
for(int i = 1; i <= n; i++)
sum += log(i) / log(d);
return (int)(sum) + 1;
}
int main() {
while(scanf("%d %d", &n, &d) != EOF) {
memset(s, 0, sizeof(s));
printf("%d %d\n", zero_num(), dight_num());
}
return 0;
}