奇怪的函数 (codevs 3538/1696) 题解

【题目描述】

     给定n,使得x^x达到或超过n位数字的最小正整数x是多少?

【样例输入】

     11

【样例输出】

    10

【解题思路】

     首先想到枚举,但是范围有点大,n<=2*10^9,果断用二分。其实这道题并不难,要用到一个求位数的公式trunc(t*(ln(t)/ln(10)))+1,初三自然是没学的,直接抄上公式,AC……,二分的时候注意一下退出的条件。(wikioi上1696和3538的题目不一样,但同一个程序都能AC,也不知道1696中的k是干嘛的……)

【代码实现】

 1 var n:qword;
 2 function js(t:longint):qword;
 3 begin
 4  if t=1 then
 5   js:=1
 6  else
 7  js:=trunc(t*(ln(t)/ln(10)))+1;
 8 end;
 9 procedure ef(l,r:longint);
10 var m:longint;
11 begin
12  if l=r then//退出条件,如果l=m,js(m)>=n,就无法二分了,也不难证明这个即为答案。同理,m+1与r一个意思
13   begin
14    writeln(l);
15    exit;
16   end;
17  m:=(l+r)div 2;
18  if js(m)>=n then//比n大,往左走,
19   ef(l,m)
20  else
21   ef(m+1,r);
22 end;
23 begin
24  readln(n);
25  ef(1,2000000000);
26 end.
奇怪的函数

 

转载于:https://www.cnblogs.com/PengBoLiuXu/p/4483796.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值