“求 N 阶乘末尾的第一个非零数字”是一道常见的企业笔试题。这里我们略微做个变化,求 N 阶乘末尾的第一个非零 K 位数,同时输出末尾有多少个零。
输入格式:
输入给出一个不超过 10
7
的正整数 N 和要求输出的位数 0<K<10。
输出格式:
在一行中输出 N 阶乘末尾的第一个非零 K 位数(注意前导零也要输出)、以及末尾 0 的个数,其间以 1 个空格分隔。
输入样例:
18 5
输出样例:
05728 3
思路:对于第一个非零 K 位数,从K比较小(0<K<100<K<10),
可知这里就是突破口。(这也是我们做题的经验,如果其他数值
比较大,需要特别关注值比较小的数,一般就是解题的关键)
因为相乘过程中溢出部分不会影响最后面的几位,所以只需要
每次除了0(所以采用方式2统计末尾0的个数比较方便)只需
保留相乘结果的后十几位
#include<iostream>
using namespace std;
typedef long long LL;
int a[15];
int main(){
int n,k;
cin>>n>>k;
LL sum = 1;
LL cnt=0;
LL mod=1e15;
for(int i=1;i<=n;i++){
sum=sum*i;
while(sum%10==0){
cnt++;
sum/=10;
}
sum%=mod;
}
int t=0;
while(k--){
a[t++]=sum%10;
sum/=10;
}
for(int i=t-1;i>=0;i--){//倒着输出
cout<<a[i];
}
cout<<" "<<cnt;
return 0;
}