Leftmost Digit

HDU1060

题意:

给你一个数字N,求N^N的最左边数字(1<=N<=1,000,000,000)

思路:

这题先打表找了下规律,发现并没有HDU1061那样的规律.好吧,只能老老实实想了.
求最左边的数字,我们可以通过nn/(nn的位数-1)取得
一个数的位数就是int(log10(n))+1;
而n^n的位数就是int(nlog10(n))+1;
设m=n^n,两边取对数,log10(m)=n
log10(n)
左边移过去就是 m=10^(nlog10(n));
则 nn=10(n
log10(n));
所以nn/(nn的位数-1)=(10^(nlog10(n)))/(int(nlog10(n)))//(1已经约掉了)
=(10(n*log10(n)))/(10(int(log10(nlog10(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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值