请稍侯

ACM Steps题目:Left Most Digit

18 May 2015

题目


Given a positive integer N, you should output the leftmost digit of NN.

大意是给定一个正整数N,求N的N次方的最左边一个数。

解题思路


一开始想用right most那一题的思路,找规律,但是发现没有什么好的规律可找,也可能是受上一题的思路影响太大了,一直没有跳出思维定式。

想了好几天,实在想不到了,就去网上翻博客去了。看完觉得,数学好真是牛逼啊。

首先,对于10的幂次10c,可以转换成10a+b,其中c=a+b,a>=1,b<1&&b>=0。那么10a+b=10a * 10b。因为10a必然是10的整数幂,而0<=b<1,所以1<=10b<10,所以10c的最左边一位由10b决定。

好了,现在我们要找的就是b是多少。我们令NN = 10c,两边同时取10为底的对数,有log10(NN) = log(10c),即Nlog10(N)=c,那么b就是Nlog10(N)的小数部分了。求出b以后,再求10b即可得到leftmost digit。

下面是我的代码。

#include <math.h>
#include <stdio.h>
int main()
{
    int t, n;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        double f = n*log10((double)n);
        double decimal = f - floor(f);
        int ans = floor(pow(10, decimal));
        printf("%d\n", ans);
    }
}

本作品由 pskun 创作