您的位置:首页 > 其它

HDU 1060 Leftmost Digit

2016-01-13 21:21 309 查看
【链接】:click here~~

【题意】:求n^n得到的数的最左边的数

【思路】

开始看到此题首先想到的是位运算,记得有一个向右取第k 位数的技巧: num >> (num_length-1) & 1,则还需要知道数的位数,可以转换成字符串来处理

另外一种巧妙的方法:

需要用到科学记数法和对数运算的知识:把num^num的值记作:num^num=a*10^n,比如三位数abc= a.bc*10^2,那么(1<a<10);

然后通过两边取对数的方法得到num*log10(1.0*num)=log10(a)+n,这时0<log10(a)<1;令x=n+log10(a),得到log10(a)=x-n;所以a=10^(x-n);n为整数部分,log10(a)为小数部分,由x=n+log10(a),可知(int)x=n;最终a=10^(x-n)=10^(x-(int)x)

代码:

<span style="font-family:SimSun;font-size:14px;">#include <queue>
#include <deque>
#include <vector>
#include <stack>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>

using namespace std;
int main()
{
    // freopen("1.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        double m;
        if(n==1){puts("1");continue;}
        m=n*log10((double)n);
        m-=(long long)m;
        printf("%d\n",(int)pow(10,m));
    }
    return 0;
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: