首页 > 代码库 > 水题 第三站 Leftmost Digit
水题 第三站 Leftmost Digit
完全没想到要用对数解决这个问题,看了网上的思路觉得很妙,也学到了解决大数问题的一个新方法,在这里尝试解释一下。
求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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。