码迷,mamicode.com
首页 > 其他好文 > 详细

Digits of Factorial LightOJ - 1045

时间:2018-02-12 13:40:42      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:很多   pre   pos   class   lightoj   include   efi   阶乘   str   

题目就不再发了,大致意思就是给你一个十进制数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\n",i);
        else
           {
               ww=aa[m];//此处两行就是上边我介绍的核心思想了
            ww=ww/log(n)+1;//至于为什么+1,自己再想想啦
            printf("Case %d: %d\n",i,(int)ww);
           }
    }
    return 0;
}

 

Digits of Factorial LightOJ - 1045

标签:很多   pre   pos   class   lightoj   include   efi   阶乘   str   

原文地址:https://www.cnblogs.com/nr1999/p/8443886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!