求$N^N$的首位数字

正如"大得多"定理所言,当$n\longrightarrow \infty$时:

$$  n^n \gg n! \gg a^n \gg n^b \gg ln^kn $$

$f(n) = n^n$的增长速度十分惊人.(其中$a>1,b>0,k\ge1$)

这个问题比求$n^n$的末位数字复杂不少,因为乘法中首位数字的确定与后面所有位上的数字都会有关系.

显然高精度运算是一个选择,不过当$n$巨大时还是可能会吃不消,这里介绍一种比较巧的办法.

这里先约定$lg(n)$即为$log_{10}(n)$;

1.任给一个数$n$,总有$n=10^{lg(n)}$.

2.$lg(n)$可以拆成$[lg(n)]+\{lg(n)\}$的形式,即拆成整数部分与小数部分之和.

3.一个数乘上$10^m$其首位数字不会发生变化($m$为非负整数),因此$10^{lg(n)}$的最高位即$10^{\{lg(n)\}}$的最高位,而$0\le\{lg(n)\}<1$,因此$ 1\le10^{\{lg(n)\}} \le  9$,因此可以用pow函数快速求出该幂,然后截断取整数部分即可.

贴一下代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     double n;
 6     scanf("%lf",&n);
 7 
 8     double m = n*log10(n);
 9     m = m - floor(m);
10 
11     double res = pow(10,m);
12     printf("%d\n",(int)res);
13 
14     return 0;
15 }

 

转载于:https://www.cnblogs.com/Keynman/p/9509910.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值