问题链接POJ NOI MATH-7657 连乘积末尾0的个数

总时间限制:
1000ms
内存限制:
65536kB
描述

给定两个正整数a,b(a < b)。求连乘积:

a×(a+1)×(a+2)×...×(b-1)×b

的末尾有多少个0?

输入
一行,包括两个正整数a,b。a < b <= 10000
输出
一个整数,即连乘积末尾0的个数。
样例输入
11 56
样例输出
11
来源
《奥数典型题举一反三(小学五年级)》 (ISBN 978-7-5445-2882-5) 第三章 第三讲 习题4


问题分析

  这是一个计算的问题,需要数一下5的倍数的个数,同时需要数一下2的倍数的个数,取它们的最小值作为计算结果。

  例如124*125,其中2的倍数的个数是2,5的倍数的个数是3。

程序说明

  (略)。




AC的C++语言程序:

#include <iostream>

using namespace std;

int main()
{
    int a, b, ans2, ans5, d, x;

    cin >> a >> b;

    ans5 = 0;
    ans2 = 0;

    d = 5;
    for(;;) {
        if(b / d == 0)
            break;
        ans5 += b / d;
        d *= 5;
    }

    d = 5;
    for(;;) {
        if((a - 1) / d == 0)
            break;
        ans5 -= (a - 1) / d;
        d *= 5;
    }

    for(int i=a; i<=b; i++) {
        x = i;
        while((x & 1) == 0) {
            ans2++;
            x >>= 1;
        }

        if(ans2 >= ans5)
            break;
    }

    cout << min(ans5, ans2) << endl;

    return 0;
}