码迷,mamicode.com
首页 > 其他好文 > 详细

水题 第三站 Leftmost Digit

时间:2017-07-10 23:34:40      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:注意   highlight   为什么   ret   blog   string   水题   nbsp   完全   

完全没想到要用对数解决这个问题,看了网上的思路觉得很妙,也学到了解决大数问题的一个新方法,在这里尝试解释一下。

求N^N的第一位数字是多少

取对数log10(N^N)=N*log10(N)

N^N=10^(N*log10(N))=10^N*10^log10(N)

因为10^M当M为整数时,第一位肯定是1,所以取决于N*log10(N)的小数部分,即m=N*log10(N)-(long long)N*log10(N);

要注意的细节很多

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;

int main ()
{
    int T;
    double a;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf",&a);
        double m = a*log10(1.0*a)-(long long)(a*log10(1.0*a));//此处注意a*log10(1.0*a)可能会超过int范围,虽然我也不明白为什么要将log10()里面的数转化为double类型
        printf("%d\n",(int)pow(10.0,m));
    }
    return 0;
}

  刚开始写log10()都写错了 = =,蠢哭

 

水题 第三站 Leftmost Digit

标签:注意   highlight   为什么   ret   blog   string   水题   nbsp   完全   

原文地址:http://www.cnblogs.com/JiaoZha/p/7148044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!