HDU1060 Leftmost Digit

1.题目简介:

求一个n^n的最左一位。n也是大数,大小是0<n<1,000,000,000, 所以直接算要么是超时,要么是数据溢出。所以不能硬算。

 

2.技巧点拨:

(由于要推导,我将过程写在了纸上)

 

3.困难实现:

①。怎么取整,如1.438...,怎么得到1?

        用强转类型的方法很容易得到,如(int )1.438.. = 1.即它的最左边是1。

②。数字很大,建议用long long型。(我用int型提交错误了一次)。

 

4.代码分析:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int kase;
    long long n;
    int m;
    cin >> kase;
    while(kase--)
    {
        cin >> n;
        float term = n*log10(n)-(long long)(n*log10(n));
        m = (int)pow(10,term);
        cout << m << endl;
    }
    return 0;
}

 

5.带入数字看代码。

比如,我带上n = 5,即要求5^5的最左边的个数。

m = n x n = 25;

m = 10^(  5 x log10(5)  );

m = 10^(   5 x log10(5)   -  (int)(5 x log10(5))     +   (int)(5 x log10(5))    ), 前两项的和是求小数项,最后一项是求整数项。

10的整数项次都是1后面许多0,(如1....0),,10的小数次结果取整后即为第一项。

 

6.认真思考,然后尝试一下,你一定会做出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值