1. 程式人生 > >Digits of Factorial LightOJ - 1045

Digits of Factorial LightOJ - 1045

blog mat 好的 兩個 define ria long sca 直接

題目就不再發了,大致意思就是給你一個十進制數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