找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;
}
时间: 2024-10-01 15:27:50

找0的个数的相关文章

阶乘中0的个数-poj 1401

POJ 1401 Factorial 题目略去.题很长,抽象过后就是求一个n的阶乘中0的个数. 分析:10=2*5,所以求最多有几对2和5就行.又考虑到2的个数肯定比5的个数多.所以只需要求5的个数.

[华为机试练习题]46.计算二进制数的0的个数

题目 描述: 输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算.不需要考虑负数的情况. 题目类别: 位运算 难度: 初级 运行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 要计算的十进制非负数 输出: 二进制中第一个1之后0 的个数 样例输入: 2 样例输出: 1 代码 /*--------------------------------------- * 日期:2015-07-03 * 作者:SJF0115 * 题目:计算二

【新人求助!】如何编写输入一个数字找0到这个数字范围内的所有偶数

问题描述 大神们帮帮忙吧,小的是才进入大一没几天的人,之前毫无基础,现在在gedit编写java格式的文件然后在terminal里check,但是很多都没有思路啊,如列出的以下:1.输入一个数字找0到这个数字范围内的所有偶数2.输入一系列数字找其中的最小正整数3.输入一个大于0的数字,在terminal里回复得到*的符号然后依次递减排成几排e.g.:输入:5得到:***************4.输入一个单词,得到单词的相反顺序,判断单词是否是回文e.g.:输入:apple得到:elppap.s

java阶乘计算获得结果末尾0的个数代码实现_java

看到题目后,分析了下, 10的阶乘就已经很大了.计算出来再得到这个末尾的0的个数,完全不现实,即使实现了也是很麻烦的. 后来想某个数的阶乘中乘积有5结尾的数字的时候就应该在结果的末尾产生一个0. 付诸实现,测试了几个, 没出错. 贴出来, 大家看看, 有问题了及时指教: 复制代码 代码如下: /**     * 求1000~10000之间的数n的阶层并计算所得的数n!末尾有多少个0?     */    public static void test2(int number){        i

找出m个数中最小的n个数的算法

这个问题属于常见问题了,我的办法是采用堆. 截取STL中的partial_sort算法的实现: template <class RandomAccessIterator, class T, class Compare> void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, T*, Compare comp) { make_heap(first

Java字符串中找单词出现个数?

问题描述 统计这篇短文用了多少个单词"to".TherewasanAmericancouplewhohadnochildren,sotheywantedtoadoptachild.Finally,anorphanagecontactedthem,saying,"Wehaveababyforadoption.It'saRussianorphan."Thecouplewasdelightedandwenttobringthebabyhome.Onthewayhome,t

1-0组成的串中,1和0个数相等的最长子串

同学面试遇到的题,我以尽量简单的方式描述,偶子串这个概念是为了表述创造的概念. Problem 如果一个串只由1和0组成,并且其中1和0的个数相等,我们称之为偶子串.给出一个只由1和0组成的串,求这个串中的子串中,最长的偶子串. Input 第一行是N,测试用例的总数,接下来是N行1和0组成的串 Output N行结果,最长偶子串可能有多 Sample Input 5 100111011001 10001111 10010111 100111010011 0111101010101110 Out

c++容器-关于 multiset 容器用法的疑问?问题来源于“找最小的k个数”

问题描述 关于 multiset 容器用法的疑问?问题来源于"找最小的k个数" 以下为"找最小k个数"中的一段代码,它使用了 multiset 容器,基于红黑树实现, 而这段算法的思想是 最大堆的思想,下面算法中 leastNumbers.begin() 应是指向最大值,这是为什么? 红黑树应是一颗二叉搜索树,为什么能保证 leastNumbers.begin() 指向最大值? typedef multiset<int, greater<int>

[华为机试练习题]61.找出字符串中第一个出现次数最多的字符

题目 描述: 找出字符串中第一个出现次数最多的字符 详细描述: 接口说明 原型: bool FindChar(char* pInputString, char* pChar); 输入参数: char* pInputString:字符串 输出参数(指针指向的内存区域保证有效): char* pChar:出现次数最多的字符 返回值: false 异常失败 true 输出成功 练习阶段: 初级 代码 /*--------------------------------------- * 日期:2015