洛谷 P1134 阶乘问题

来源:互联网 发布:魔兽世界服务端源码 编辑:程序博客网 时间:2024/06/02 04:06

洛谷 P1134 阶乘问题

//P1134 阶乘问题
//样例花了些时间,一直不明白,12的阶乘最右边的非零位为6
//12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001,600
//非零位,不是4 7 9 1 6共5位吗?反复读题,好半天,才弄明白非零位6是指600中的6
//本题有思路了,对10取余
//编写代码稍微费了些周折,但很快编好,样例通过
//测试了50000000,感觉介于超时与不超时之间,提交测试点4,5,7WA
//找不到测试数据,那么只能自己测试,发现20 输出8 实际4
//1! 1 2! 2 3! 6 4! 4 5! 2 6! 2 7! 4 8! 2 9! 8 10! 8 11! 8 12! 6 13! 8 14! 2 15! 8 16! 8 17! 6 18! 8 19! 2 20! 4实际
//1! 1 2! 2 3! 6 4! 4 5! 2 6! 2 7! 4 8! 2 9! 8 10! 8 11! 8 12! 6 13! 8 14! 2 15! 1 16! 6 17! 2 18! 6 19! 4 20! 8程序
//15!开始出问题,之后的数据全受影响。感觉不断的会有进位。乘的过程中,不断的会出现0.很难处理啊!算法应该要有极大的改变。
//搜索网络,原理角度,该篇文章不错,http://blog.csdn.net/chai_jing/article/details/53132363。摘抄如下:
//【分析】一遇到数学题就怂 方法吧 把2 5拿出来凑成一个10 然后扔了= = 手玩一下10的阶乘发现只有2 5能凑成十 然后质因数2的数量貌似一定比5多的样子
//然后就把2全部拿出来 拿一个cnt加一 同时把5全部拿出来 拿一个cnt减一
//直接在最开始加上%10好像可以更快些= =(那是不是%100更快?不知道)最后必然是2会多出来一些 然后2的乘方是可以找规律的 打表即可
//代码角度,该篇文章比较清晰,http://blog.csdn.net/rlt1296/article/details/53070283
//提交,测试点7 TLE
//进行优化:2^1=2 2^2=4 2^3=8 2^4=16 2^5=32 2^6=64 2^7=128 2^8=256

附上AC代码:

#include <stdio.h>
int main(){
    int n,i,j,ans=1,cnt=0,a[4]={6,2,4,8};
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        j=i;
        while(j%2==0){
            j/=2;
            cnt++;
        }
        while(j%5==0){
            j/=5;
            cnt--;
        }
        ans*=j;
        ans%=10;
    }
    ans*=a[cnt%4];//cnt个2的处理
    ans%=10;
    printf("%d\n",ans);
    return 0;
}


附上测试点7 TLE代码:

#include <stdio.h>
int main(){
    int n,i,j,ans=1,cnt=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        j=i;
        while(j%2==0){
            j/=2;
            cnt++;
        }
        while(j%5==0){
            j/=5;
            cnt--;
        }
        ans*=j;
        ans%=10;
    }
    for(i=1;i<=cnt;i++){
        ans*=2;
        ans%=10;
    }
    printf("%d\n",ans);
    return 0;
}



附上测试点4,5,7WA代码:

#include <stdio.h>
int main(){
    int n,i,j,ans=1;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        j=i;
        while(j%10==0)
            j/=10;
        j%=10;
        printf("j=%d ",j);
        ans*=j;
        while(ans%10==0)
            ans/=10;
        ans%=10;
        printf("ans=%d \n",ans);
    }
    printf("%d\n",ans);
    return 0;
}

2017-5-20 11:21

原创粉丝点击