Leftmost Digit

HDU1060

題意:

給你一個數字N,求N^N的最左邊數字(1<=N<=1,000,000,000)

思路:

這題先打表找了下規律,發現並沒有HDU1061那樣的規律.好吧,只能老老實實想了.
求最左邊的數字,我們可以通過n^n/(n^n的位數-1)取得
一個數的位數就是int(log10(n))+1;
而n^n的位數就是int(n*log10(n))+1;
設m=n^n,兩邊取對數,log10(m)=n*log10(n)
左邊移過去就是 m=10^(n*log10(n));
則 n^n=10^(n*log10(n));
所以n^n/(n^n的位數-1)=(10^(n*log10(n)))/(int(n*log10(n)))//(1已經約掉了)
=(10^(n*log10(n)))/(10^(int(log10(n*log10(n))))
=10^( n*log10(n)-int(n*log10(n) )
數據比較大,int要改爲long long

Code:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
    int t,n;
    double digit;
    double  ans;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        // m=n^n log10(m)=n*log10(n)
        //n^n=m=10^(n*log10(n))
        digit=n*log10(n);  
        //cout<<"digit="<<digit<<endl;
        double tmp=digit-ll(digit);
       // cout<<"tmp="<<tmp<<endl;
         ans= pow(10.0,tmp);//n^n/(digit-1)就是最左邊的數;
         cout<<int(ans)<<endl;
       //  cout<<"ans="<<int(ans)<<endl;
//        ans=pow(10.0,n*log10(n)-temp+1);  // n^n/(temp-1)jiu;
      //  cout<<int(tmp)<<endl;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章