试题 算法训练 P0505 链接
一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5!=12345=120,因此5!最右边的那个非0的数字是2。再如,7!=5040,因此7!最右边的那个非0的数字是4。再如,15!= 1307674368000,因此15!最右边的那个非0的数字是8。请编写一个程序,输入一个整数n(0<n<=100),然后输出n!最右边的那个非0的数字是多少。
输入:
7
输出:
4
直接模拟n!的求法,由于n<=100,不能使用基本类型,使用高精度模拟,即可得到答案。下面是我的代码。
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
using namespace std;
int ans[1000][1000];
int main()
{
ans[1][1]=1;
for(int i=2;i<=100;i++)
{
for(int j=1;j<=500;j++)
ans[i][j]=ans[i-1][j]*i;
for(int j=1;j<=500;j++)
if(ans[i][j]>9){
ans[i][j+1]+=ans[i][j]/10;
ans[i][j]%=10;
}
}
int n;cin>>n;
int len=1;
while(ans[n][len]==0) len++;
cout<<ans[n][len]<<'\n';
system("pause");
return 0;
}
该程序解决了一个数学问题,即对于给定的整数n(0<n<=100),不计算n的阶乘,而是找出n!最右边的非零数字。通过高精度模拟乘法过程,避免了数据溢出,最终输出n!的最后一个非零数字。例如,输入7时,输出结果为4,因为7!的尾部非零数字是4。
353

被折叠的 条评论
为什么被折叠?



