算法训练 阶乘末尾
时间限制:1.0s 内存限制:256.0MB
问题描述
给定n和len,输出n!末尾len位。
输入格式
一行两个正整数n和len。
输出格式
一行一个字符串,表示答案。长度不足用前置零补全。
样例输入
6 5
样例输出
00720
数据规模和约定
n<=30, len<=10。
思路:
阶层的题目最需要考虑的就是溢出问题,考虑到n的范围是到30,30的阶层是一个非常巨大的数字,一定会溢出的。
所以我们需要在求阶层的时候对其取模来确保数据不会溢出。
取模的数需要自己去尝试,本题的话11位数字可以满足22阶层以及以上的阶层不会溢出
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,len;
long long sum=1; //若不用long long则n=18时就会溢出
int a[11];
scanf("%d %d",&n,&len);
for(int i=1;i<=n;i++)
{
sum*=i;
sum%=10000000000; //除以十一位数,否则n=22时依旧会溢出 !!
}
for(int i=len;i>0;i--)
{
a[i]=sum%10; //从个位数开始保存
sum/=10;
}
for(int i=1;i<=len;i++)
{
printf("%d",a[i]); //逆序输出
}
return 0;
}