📅  最后修改于: 2023-12-03 15:42:14.250000             🧑  作者: Mango
本次主题为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的解答,文中给出了题目的分析思路以及代码实现,并提供了测试样例供读者参考。