UVA10061 How many zero's and how many digits ?

来源:互联网 发布:ios彩票app源码 编辑:程序博客网 时间:2024/05/22 09:05

Problem G

How many zeros and how many digits?

Input: standard input

Output: standard output


Given a decimal integer number you will have to find out how many trailing zeros will be there in its factorial in a given number system and also you will have to find how many digits will its factorial have in a given number system? You can assume that for a b based number system there are b different symbols to denote values ranging from 0 ...b-1.


Input

There will be several lines of input. Each line makes a block. Each line will contain a decimal number N (a 20bit unsigned number) and a decimal number B (1<B<=800), which is the base of the number system you have to consider. As for example 5! = 120 (in decimal) but it is 78 in hexadecimal number system. So in Hexadecimal 5! has no trailing zeros


Output

For each line of input output in a single line how many trailing zeros will the factorial of that number have in the given number system and also how many digits will the factorial of that number have in that given number system. Separate these two numbers with a single space. You can be sure that the number of trailing zeros or the number of digits will not be greater than 2^31-1


Sample Input:

2 10
5 16
5 10

 

Sample Output:

0 1
0 2

1 3


题目意思就是给两个数 m,n。。然后求出 m的阶乘变为n进制,有几个0,有几位数。。。

如果直接求阶乘绝对就是大到存不了。。

先说如何求末尾几个0;10进制数的末尾几个零就是求他的因子里出现了几个5.因为10 = 2 × 5;出现一个因子5就会有个0;

如果是16进制 16 =2×2×2×2就是每出现4个2 就有个0;总结就是n进制的话。求n的最大质因数,和最大质因数的数量。


然后把所有的数分解出最大质因数,数量除以n分解出来最大质因数数量。。。


位数的话就是log(m) / log(n)。。注意为了精度要加上1e-9。。。


AC代码:


#include<stdio.h>#include<cmath>#include<string.h>int count[10485800];int max(int n,int b) {memset(count,0,sizeof(count));int l;double count2 = 0;for ( int i = 2;i <= b ;i++) {while (b % i == 0 ) {l = i;count[l]++;b /= i;}}for (int i = 2;i <= n ;i++) {int k = i;while( k % l == 0) {count2++;k /= l;}}count2 /= count[l];return (int) count2;}int main () {double num;double base;double res;double res2;while (scanf("%lf%lf",&num,&base) != EOF ) {res = 0;for (double  i = 1 ; i <= num ;i++) {res = res + log(i);}    intlen = (res / log(base) + 1e-10);printf("%d %d\n",max((int)num,(int)base),len + 1);}return 0;}


0 0
原创粉丝点击