阶乘尾数0的个数

题目:http://tonylin.top/Conpro/read/pid/1048/cid/100060

给出q,求最小的n满足n!的末尾零个数为q

Input:

输入第一行为一个整数T(1 <= T <= 1000),表示测试数据有T组
2~T+1行 每行包含一个整数q(1 <= q <= 1e8),代表一组测试数据


Output:

对于每组测试数据,按照样例格式输出case number和n,如果没有可行解则输出"impossible"(不包含引号)

Sample Input:

3
1
2
5

Sample Output:

Case 1: 5
Case 2: 10
Case 3: impossible

思路:先写出函输求n!的尾数0个数,每个5的倍数贡献一个0,但是25贡献2个,125贡献3个。用二分法找一定范围内的整数的尾数个数等于q的情况。代码:
#include<stdio.h>
#define ll long long
ll q,n,t,s,h;

ll finda(ll x)///求x!的尾数的0的个数
{
    ll num=0;
    while(x/5!=0)
    {
        x=x/5;
        num=num+x;
    }
    return num;
}

ll fen(ll s,ll h,ll q)///二分法查找
{
    ll m=(s+h)/2;
    if( finda(m)==q ) return m;
    else if( s==h ) return 0;///找到最后还找不到,另一个出口
    else if( finda(m)<q ) return fen( m+1,h,q );
    else return fen( s,m,q );///正宗二分法,s~m和m+1~h
}

int main()///1048
{
    int cnt=0;
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%lld",&q);
        s=1;
        h=500000000;
        n=fen(s,h,q);
        if( n==0 )
            printf("Case %d: impossible\n",++cnt);
        else
        {
            if(n%5==0)
                printf("Case %d: %lld\n",++cnt,n);
            else
                for(int i=1;i<=4;i++)
                if( (n-i)%5==0 )
                {
                    printf("Case %d: %lld\n",++cnt,n-i);
                    break;
                }
        }
    }
    return 0;
}

 

原文地址:https://www.cnblogs.com/shoulinniao/p/9499478.html

时间: 2024-08-29 18:15:17

阶乘尾数0的个数的相关文章

n阶乘 尾数0的个数

class Solution {public: int trailingZeroes(int n) {            if(n<=0) return 0; int i=0;           int res=0; while(n){ res+=n/5; n=n/5; } return res;}}; 很神奇的,eg  125 125=25*5,相当于前前面有1,2,3,4,5,……,20,21,22,23,24,25  * 5 125/5 = 25 相当于前面变成0,0,0,0,1,…

正数阶乘结尾0的个数

题目:对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度.如:18!=6402373705728000,尾部连续0的个数是3. (不用考虑数值超出计算机整数界限的问题). 刚看到这道题,脑子中一闪而过的肯定是最原始的方法,但是仔细看看题目,不考虑超出计算机整数边界的问题.显然如果数据过大,求阶乘本身就是个复杂的计算,然后再找结果尾数为0的个数. 1.这个问题当然有简便的方法,我们这样思考,结尾0的个数,就是乘积是10的倍数,因子中有多少个10 就有多少个零,10再次分解就

阶乘中0的个数

任何一个数分解质因数后,表达为2的x1次方   *     3的x2次方   *    5 的x3次方  等等 0的来源于2*5,x1>x2 ,所以阶乘中0的个数为5的个数,下面就很简单了. http://acm.nyist.net/JudgeOnline/problem.php?pid=84 import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-ge

阶乘末尾0的个数(证明)

先给出算法: 给定n,求n的阶乘末尾0的个数. int res = 0; while (n > 0) { res += n / 5; n /= 5; } 因为: 比方说求15的阶乘,也就是求 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 10 × 11 × 12 × 13 × 14 × 15 的末尾0的个数.现在我们把这15个数分解出来含有5的因子 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 2   × 11 × 12 × 13 × 14 ×

N的阶乘末尾0的个数和其二进制表示中最后位1的位置

问题一解法: 我们知道求N的阶乘结果末尾0的个数也就是说我们在从1做到N的乘法的时候里面产生了多少个10, 我们可以这样分解,也就是将从0到N的数分解成因式,再将这些因式相乘,那么里面有多少个10呢? 其实我们只要算里面有多少个5就可以了? 因为在这些分解后的因子中,能产生10的可只有5和2相乘了,由于2的个数是大于5的个数的,因此 我们只要算5的个数就可以了.那么这个题目就是算这些从1到N的数字分解成因子后,这些因子里面 5的个数. Python代码 def factorialnumberof

阶乘末尾0的个数问题

问题:给定一个整数N,那么N的阶乘N!末尾有多少个0? 比如:N=10,N!=3628800,N!的末尾有2个0,写出算法. 回答: int countZero(int N) {    int ans = 0;    int maxInt = 1000000000;//10^9    int  tmpn = N;    while(tmpn){        maxInt /= 10;        tmpn /= 10;    }    int lastBit = 1; //保存上一个阶乘 的

LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 &amp; 二分

题目链接:http://lightoj.com/volume_showproblem.php?problem=1138 题意:给你一个数n,然后找个一个最小的数x,使得x!的末尾有n个0:如果没有输出impossible 可以用二分求结果,重点是求一个数的阶乘中末尾含有0的个数,一定和因子5和2的个数有关,因子为2的明显比5多,所以我们只需要求一个数的阶乘的因子中一共有多少个5即可; LL Find(LL x) { LL ans = 0; while(x) { ans += x/5; x /=

求一个数阶乘末尾0的个数

#include<iostream> using namespace std; //给定一个整数N,那么N的阶乘末尾有几个0?N=10,N!=3628800,末尾有2个0 //1.如果我们从"哪些数相乘能得到 10"这个角度来考虑,问题就变得简单了. //首先考虑,如果 N!= K×10M,且 K 不能被 10 整除,那么 N!末尾有 M 个 0.再考虑 //对 N!进行质因数分解,N!=(2x)×(3y)×(5z)-,由于 10 = 2×5,所以 M 只跟 X 和 Z /

Java 计算N阶乘末尾0的个数-LeetCode 172 Factorial Trailing Zeroes

题目 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 分析 Note中提示让用对数的时间复杂度求解,那么如果粗暴的算出N的阶乘然后看末尾0的个数是不可能的. 所以仔细分析,N! = 1 * 2 * 3 * ... * N 而末尾0的个数只与这些乘数中5和2的个数有关,因为每出现一对5和2就会产生