首页 > 代码库 > uva 10061(数学)
uva 10061(数学)
题解:题目要在b进制下输出的是一个数字阶乘后有多少个零,然后输出一共有多少位。首先计算位数,log(n)/log(b) + 1就是n在b进制下有多少位,而log有个公式就是log(M×N) = logM + logN,n! 的位数用公式可以化为( log(1) + log(2) +...+log(n) ) / log(b) + 1,为了精确再加 10^-6。阶乘后的零的数量计算是根据进制数的最大质因数和其数量确定的,比如10 = 2 × 5,所以10进制的最大质因数是5,数量是num = 1,例如100!中的所有因子除五,能分解出来因子5的数量的和再除num就得到了后导0的数量24。
#include <cstdio> #include <cmath> using namespace std; int find(int n, int b) { int max = -1;//寻找最大质因数 int flag1 = 1;//最大质因数数量 for (int i = 2; i <= b; i++) { while (b % i == 0) { b = b / i; if (max < i) { max = i; flag1 = 1; } else if (max == i) flag1++; } } int flag2 = 0;//能分解出来的最大质因数的数量 int temp; for (int i = 1; i <= n; i++) { temp = i; while (temp % max == 0) { temp /= max; flag2++; } } flag2 = flag2 / flag1; return flag2; } int main() { int n; int b, flag, len; double l; while (scanf("%d%d", &n, &b) != EOF) { flag = l = 0; for (int i = 1; i <= n; i++) l += log(i); len = l / log(b) + 1e-6; flag = find(n, b); printf("%d %d\n", flag, len + 1); } return 0; }
uva 10061(数学)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。