📜  门| Gate IT 2007 |问题25(1)

📅  最后修改于: 2023-12-03 15:42:14.250000             🧑  作者: Mango

门| Gate IT 2007 |问题25

本次主题为Gate IT 2007年考题中的问题25,该题要求程序员实现一个 C++ 函数,实现对于一个正整数 n,求出使得 n !表示的数最后一个非零数字的位置。

题目分析

对于一个整数 n,要求其阶乘表示的最后一个非零数字的位置,可以转化为求其阶乘中5和2的个数,因为一个阶乘中0的个数取决于其中5和2的个数,而5的个数往往比2的个数少,因此只需要算出其中5的个数即可。

首先,我们统计 n 中含有因数 5 的数目,即 n 中 5 的倍数的个数,即可得到最后一个非零数字的位置的个位数,此时 n! 中各位上的数字均为非零数字,而最后一个非零数字的位置也由此确定。

然后,我们统计 n 中含有因数 25 的数目,即 5 的倍数的倍数的个数,即可得到最后一个非零数字的位置的十位数,由于我们仅需要求出个位和十位,因此不必统计含有因数 125 及其以上的数目。

最终,将步骤一和步骤二所得结果相加,即可求出最后一个非零数字的位置。

代码实现
int lastDigitPosition(int n) {
    int count = 0;
    for (int i = 5; i <= n; i *= 5) {
        count += n / i;
    }
    int tensCount = 0;
    for (int i = 25; i <= n; i *= 5) {
        tensCount += n / i;
    }
    return (count + tensCount) % 10;
}
测试样例
int main() {
    assert(lastDigitPosition(1) == 1);
    assert(lastDigitPosition(5) == 2);
    assert(lastDigitPosition(10) == 2);
    assert(lastDigitPosition(15) == 2);
    assert(lastDigitPosition(20) == 4);
    assert(lastDigitPosition(25) == 8);
    assert(lastDigitPosition(30) == 8);
    assert(lastDigitPosition(35) == 8);
    assert(lastDigitPosition(40) == 8);
    return 0;
}

以上为 Gate IT 2007年考题中的问题25的解答,文中给出了题目的分析思路以及代码实现,并提供了测试样例供读者参考。