• HDU 1060 Leftmost Digit (数论,快速幂)


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

    InputThe input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. 
    Each test case contains a single positive integer N(1<=N<=1,000,000,000). 
    OutputFor each test case, you should output the leftmost digit of N^N. 
    Sample Input

    2
    3
    4

    Sample Output

    2
    2
    
    
            
     

    Hint

    In the first case, 3 * 3 * 3 = 27, so the leftmost digit is 2.
    In the second case, 4 * 4 * 4 * 4 = 256, so the leftmost digit is 2.
    

    感想:一看到大数求幂就想到了快速幂,之前还想着用字符数组装大数,输出字符数组第一位再转换成数值,后来想想好像不太可行···然后没绷住搜了题解,思路是这样的:

    需要用到科学记数法和对数运算的知识。
    我们把num*num的值记作:num * num=a * 10^n,其中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)

    m=n^n(_int64);两边同取对数,得到,log10(m)=n*log10(n);再得到,m=10^(n*log10(n));

    然后,对于10的整数次幂,第一位是1,所以,第一位数取决于n*log10(n)的小数部分。

    1.求a=n^n的对数取整即位数m;【m=n*log10(n)

    2.a除以10的m次方取整即最高位;【pow(n,n)/pow(10,m)

     

    /*关键在于公式,以及在于num*log10(num)得到的结果要用long long转换为整数,而不能用int,因为int已经存不下了。*/
    
    #include "stdio.h"
    #include "string.h"
    #include "math.h"
    int main(int n)
    {
    	int C;
    	double num;
    	double a;
    	double x;
    	scanf("%d", &C);
    	while(C--)
    	{
    		scanf("%lf", &num);
    		x = num * log10(num);
    		a = pow(10, x - (long long)x);
    		printf("%d
    ", (int)a);
    	}
    
    }
    

      

     

  • 相关阅读:
    2015/12/26 十六、 八 、二 进制转十进制
    2015/12/25 ① 图灵测试 ② 安装jdk出现的问题 ③ 配置环境变量
    java如何产生随机数
    二分查找法
    冒泡排序法
    计算阶乘
    九九乘法小练习
    数组循环语句练习
    经典循环例题练习
    如何用循环语句输出一个三角形
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7212306.html
Copyright © 2020-2023  润新知