算法训练 阶乘末尾
时间限制:1.0s 内存限制:256.0MB
问题描述
给定n和len,输出n!末尾len位。
输入格式
一行两个正整数n和len。
输出格式
一行一个字符串,表示答案。长度不足用前置零补全。
样例输入
6 5
样例输出
00720
数据规模和约定
n<=30, len<=10。
#include<iostream>
using namespace std;
int a[101];
int main()
{
long long i,j,n,len;
cin >>n>>len;
long long ans=1;
for(i=1;i<=n;i++){
ans*=i;
//cout <<ans<<endl;
if(ans>1000000000){
long long tt=ans,kk=0;
while(tt>0){
if(tt<10)
break;
tt/=10;
kk++;
}
long long sum=1;
for(int h=1;h<=kk;h++)
sum*=10;
//cout <<"tt7=="<<tt*sum<<endl;
ans=ans-tt*sum;
//cout <<"skd=="<<ans<<endl;
}
}
i=0;
while(ans>0){
a[i++]=ans%10;
ans/=10;
}
for(int j=len-1;j>=0;j--){
cout <<a[j];
}
return 0;
}
2017-12-16
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
long long h, i,n,len,j,t=1;
cin >>n>>len;
for(i=1;i<=n;i++){
t*=i;
//cout <<i<< " ";
long long cnt=0,w=0;
h=0;
while(t>0){
if(cnt>=len)
break;
w=t%10;
t/=10;
cnt++;
h=h+w*pow(10,cnt-1);
}
t=h;
//cout <<t<<" "<<w<<endl;
}
cout <<setw(len)<<setfill('0')<<h<<endl;
return 0;
}