zoukankan      html  css  js  c++  java
  • Digits of Factorial LightOJ

    题目就不再发了,大致意思就是给你一个十进制数n,算出阶乘后转换成K进制的数,你来算一下它的位数。

    坑点在哪呢,就是这个数可能算阶乘的时候没放弄了,比如1000000,做过最多单算阶乘的题也就是让你算到10000,所以这个如果按正常步骤来写肯定不行啦。

    本题主要运用两个定理:

    1丶 十进制位数就是 (int)log10(n),比如,1234,就是4,55555位数就是5。

    对应K进制位数就是logk(n),但是math.h或者库函数里边log函数的底数只有固定的几个能直接用的,所以需要用到换底公式啦

    2丶:loga(n)=logm(n)/logm(a)=ln(n)/ln(a);

    3丶:核心思想  要求K进制位数:logk(n!)=ln(n!)/lnk + 1={ln(1)+ln(2)+ln(3)+...+ln(n)}/lnk  +  1;

    AC代码如下:大家看的时候可以自己再理解理解看看有没有更好的方法来解这道题啦,我这水平也有限,代码可能还不够完善呢。

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #define ll long long
    double aa[1000002];
    int main()
    {   int t,c,m,n,i;
    double ww;
    scanf("%d",&t);
    memset(aa,0,sizeof(aa));
    for(i=1;i<=1000000;i++)
        aa[i]+=aa[i-1]+log(i);//打个表来存一下前1000000个数的log(阶乘),会节省很多时间的
       for(int i=1;i<=t;i++)
        {
            scanf("%d%d",&m,&n);
            if(m==0)
                printf("Case %d: 1
    ",i);
            else
               {
                   ww=aa[m];//此处两行就是上边我介绍的核心思想了
                ww=ww/log(n)+1;//至于为什么+1,自己再想想啦
                printf("Case %d: %d
    ",i,(int)ww);
               }
        }
        return 0;
    }
  • 相关阅读:
    揭晓UX(用户体验)最大的秘密
    Js、jquery学习笔记
    网站建设之高速WEB的实现
    网站改版之指标分析
    Nodejs读写流
    Nodejs查找,读写文件
    网站建设之脚本加载
    如何利用CSS3编写一个满屏的布局
    如何设计自己的UI套件
    用requireJS进行模块化的网站开发
  • 原文地址:https://www.cnblogs.com/nr1999/p/8443886.html
Copyright © 2011-2022 走看看