题解 P1134 【阶乘问题】

· · 题解

总之……这道题非常玄学。

这是29的代码。

#include<iostream>
using namespace std;
int main()
{
    long long result=1; //存贮结果
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        result*=i;
        while(result%10==0)
            result/=10;  //去0
        result=result%10;  //每次只保留一位,防爆
    }
    cout<<result;
}

好像没啥毛病啊?为啥29? 请看:

14!=87178291200。到这里我们的程序依然正确。result存贮的是2。

15!=1307674368000。然而,2*15=30,去0后是3而非正确的8。

事实上,我们存贮的应是12,12*15=180,去0后是18,个位是正确的8。

第二次提交:

#include<iostream>
using namespace std;
int main()
{
    long long result=1;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        result*=i;
        while(result%10==0)
            result/=10;
        result=result%100;  //打星号
    }
    cout<<result%10;
}

还是29。 这就是玄学之所在了:在星号处每加2,3个零,你的分数就上升一点。

本人调了一小时程序才终于发现这个玄学的原理。

AC代码:

#include<iostream>
using namespace std;
int main()
{
    long long result=1;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        result*=i;
        while(result%10==0)
            result/=10;
        result=result%100000000;
    }
    cout<<result%10;
}

讲得应该蛮清楚了,求过⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄