题解 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;
}
讲得应该蛮清楚了,求过⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄