舍去末尾来避免求阶乘溢出的方法对进位有影响嘛

题目描述
输入一个正整数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;
}