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;
    }
  • 相关阅读:
    西山赏梅归来
    创建 WebRequest 实例并返回响应
    C# WinForm开发系列 DataGridView
    DataTable C#
    delphi 制作资源文件
    Windows Mobile上使用钩子
    OO系统分析员之路用例分析系列(7)用例规约的编写业务规则和实体描述[整理重发]
    iis下PHP5配置
    ie firefox 点flash 卡死解决方案
    PHP获取字符串编码类型
  • 原文地址:https://www.cnblogs.com/nr1999/p/8443886.html
Copyright © 2011-2022 走看看