找0的个数

简介:

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84658#problem/A
解析:
/*
对于一个数n,求出它的末尾有几个0,只需看n之内的数的质因子5的个数,因为2的个数远多于5。所以可知道一个数末尾0的个数
Q = n/5 + n/(5^2) + n/(5^3) + …
而题目给出的是Q,要求出的是N,由于是要求出最小的自然数,所以N必定是5的倍数,这点不多做解释。
根据等比数列的求和公式,有
Q = N*(5^k - 1) / [4*(5^k)],由此得
N = 4*Q * [(5^k)/(5^k-1)]
注意到 1 < (5^k)/(5^k-1) <= 5/4,且当k->无穷时,(5^k)/(5^k-1)->1,所以可先算出N=4Q的末尾零的个数与所给的Q比较,显然所求的数就在4Q的附近,所以不需要二分查找。
*/

#include <iostream>
#include <cstdio>
using namespace std;

int get(int m)
{
    int sum=0;
    while(m)
    {
        sum+=m/5;
        m/=5;
    }
    return sum;
}
int main()
{
    int m;
    while(~scanf("%d",&m))
    {
        if(m == 0)//注意0的时候是输出1,不是0,虽然0是自然数
        {
            puts("1");
            continue;
        }
        int s=4*m/5*5;
        while(get(s) < m)
        {
            s+=5;
        }
        if(get(s) == m)
           printf("%d\n",s);
        else
           puts("No solution");
    }
    return 0;
}
目录
相关文章
|
6月前
和最小的K个数对
和最小的K个数对
|
1月前
|
机器学习/深度学习
对10个数进行排序
对10个数进行排序。
22 13
|
6月前
|
Java 编译器 C++
位1的个数(C++)
位1的个数(C++)
45 0
|
6月前
1004.最大连续1的个数
1004.最大连续1的个数
30 0
输入2个数,计算这2个数的,和商积差余,
输入2个数,计算这2个数的,和商积差余,
84 0
|
机器学习/深度学习 算法
第k个数
第k个数
124 0
|
算法 Java 编译器
20天刷题计划-191. 位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。