数论中的陷阱
例题:P1134 阶乘问题
原题地址
题目描述
也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600
12的阶乘最右边的非零位为66。
写一个程序,计算N(1≤N≤50,000,000)阶乘的最右边的非零位的值。
注意:10,000,000!有2499999个零。
输入输出格式
输入格式:
仅一行包含一个正整数N。
输出格式:
一个整数,表示最右边的非零位的值。
输入输出样例
输入样例#1:
12
输出样例#1:
6
代码:
这是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>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
long long result=1;
long long int n,i;
cin>>n;
for(i=1;i<=n;i++)
{
result*=i;
while(result%10==0)
result/=10;
result=result%100000000;//*
}
cout<<result%10<<endl;
return 0;
}
我们只需在*位置改为100000000即可。