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

来源:互联网 发布:尚硅谷 java视频 编辑:程序博客网 时间:2024/06/11 12:29

题目: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;}


0 0