题目描述
输入一个正整数n。输出n!的最高位上的数字。
输入
输入一个正整数n(n不超过1000)。
输出
输出n!的最高位上的数字。
样例输入 Copy
1000
样例输出 Copy
4
提示
注意double类型溢出问题。
(这个问题有一个关于舍去末位对进位影响的疑惑,问到老师或CSDN上的大佬后我会给大家说)
#include<stdio.h>
int main()
{
int n,i,b;
double a=1.0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
a*=i;
while(a>=10)
a=a/10;
}
b=a/1;
printf("%d",b);
return 0;
}
n!的结果可以表示为:x.y * 10^k
即n!=x.y * 10^k,最终目的是求x
lg(n!)=lg(x.y)+k
x必定满足:1<=x<=9,所以:x.y必定满足1<x.y<10,所以lg(x.y)必定在0~1之间
所以k必定是lg(n!)的整数部分。即k=(int)lg(n!)
故lg(x.y)=lg(n!)-(int)lg(n!)
故x.y=10^[lg(n!)-(int)lg(n!)]
故x=(int)(x.y)
//lg(n!)=lg1+lg2+lg3+...+lgn
//ln(n!)/ln(10)=ln(1)/ln(10)+ln(2)/ln(10)+ln(3)/ln(10)+......+ln(n)/ln(10)
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n=4;
// cin>>n;
double l=0;
for(int i=1;i<=n;i++){
l+=log(i*1.0)/log(10.0);
}
cout<<l<<endl;
l-=(int)l;
cout<<l<<endl;
double fn=pow(10,l);
cout<<fn<<endl;
cout<<(int)fn;
return 0;
}