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 调节精度。
解题思路:根据十进制求尾随零的办法,求质因数 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; }
相关文章推荐
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes
- A.537 - Artificial Intelligence?