26 阶乘最后的非0位

问题描述 :

N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=1*2*3*4*5=120所以5!的最后面的非零位是2,7!=1*2*3*4*5*6*7=5040,所以最后面的非零位是4。

输入说明 :

一个不大于1000的整数N。

输出说明 :

共一行,输出N!最后面的非零位。

输入范例 :7

输出范例 :4

 

 

思想:常规思想会超时,参考了一个博主的写法,在每次阶乘后,如果为位数为0的整数,那么将其除10,直到不为整数为止,因为末尾的0并不参与后续有效运算,同时,对其计算规模加以限制,只取后4位进行阶乘,如果超过4位数,前面的直接取余去除,高位并不影响低位的计算。

 

#include <stdio.h>

int main(){
    int a;
    int i;
    scanf("%d",&a);
    long s;
    for(i=2;i<=a;i++){
        s*=i;
        while(s%10==0){
            s/=10;
        }
        s %=1000;
    }
    s%=10;
    printf("%ld",s);
    return 0;
}

 

posted @ 2022-02-26 15:05  梦想是能睡八小时的猪  阅读(131)  评论(0)    收藏  举报