zoukankan      html  css  js  c++  java
  • ACM_求N^N的最高位数

    Leftmost Digit

    Time Limit: 2000/1000ms (Java/Others)

    Problem Description:

    给定一个正整数N,你应该输出N ^ N的最左边的数字。

    Input:

    输入包含多个测试用例。 输入的第一行是单个整数T,它是测试用例的数量。 T测试用例如下。
    每个测试用例都包含一个正整数N(1 <= N <= 10000)。 Hint:64位整数使用long long int,输入输出%lld.

    Output:

    对于每个测试用例,您应该输出N^N的最左边的数字。

    Sample Input:

    2
    3
    4

    Sample Output:

    2
    2
    解题思路:对一个数N,用科学计数法表示为N=a*10^m,此时a的整数部分即为N的最高位数字,N^N的最左边的数字a即为题目所求。
    所以N^N=a*10^m,两边取对数得N*lg(N)=m+lg(a);因为0<a<10,所以0<lg(a)<1,令x=lg(a)+m(m为x的整数部分),x=N*lg(N);
    则a=10^(x-m)=10^(x-(int)x),注意这里的N最大为10^4,即x=N*lg(N)=4*10^4x小于int范围内,所以x强转为int即为m,最后输出(int)a整数部分即可。
    pow(x,y)函数计算x的y次幂。
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int T,N;
     6     while(cin>>T){
     7         while(T--){
     8             cin>>N;
     9             double x=N*log10(N);
    10             double g=x-(int)x;
    11             cout<<(int)pow(10,g)<<endl;
    12         }
    13     }
    14     return 0;
    15 }
    加强版(涉及推导数论知识)详解看这里:ACM_求N^N的前5位数和后5位数(数论)
  • 相关阅读:
    11.01T3 实数二分
    11.01T2 树状数组维护动态LIS
    11.1T1打表
    10.31T4 HAOI2010最长公共子序列 计数+容斥原理
    10.31T3 其他算法思想
    10.31T2 点双联通分量+预处理前缀+二分答案
    10.31T1 二分图
    10.30T3 换根
    10.30T2 二分+前缀和(后缀和)
    10.30T1 期望DP
  • 原文地址:https://www.cnblogs.com/acgoto/p/8885875.html
Copyright © 2011-2022 走看看