8.3 心疼

Problem  1  heart.pas/c/cpp(heart.in   heart.out)    

 【背景】

  一个美丽的夜晚,Bingo和他的MM坐在高高的NN堆旁看着天上稀稀拉拉的星星。Bingo对着MM说:“我们就像指数函数。你是底数,我是指数。不管你是大于一还是大于零小于一,我都可一让我们的幸福指数(不同于上面的指数)到正无穷。”MM说“你是底数,我是指数,我要顺着你改变”。Bingo一阵感动,但是,作为一个男人,Bingo怎么能委屈自己的MM呢。Bingo说:“不行,我会心疼你的。”MM说:“我也会心疼你啊”。…………

【题目描述】

  为了不让Bingo和他的MM谁更心疼,也就是让他们一样心疼对方,给你一个数n,请你找出最小的整数x使得xx位数大于等于n

【输入】

一个数,n

【输出】

一个数x,满足xx位数大于等于nx-1x-1位数小于n

【样例】

heart.in

11

heart.out

10

【数据规模】

 n<=1000000000000000000

思路:数据范围MS很吓人,其实利用ln就能搞定。因为lg(x)+1就是x的位数而lg(xx)=x*lg(x),利用二分查找答案,问题就迎刃而解了

程序:

var
  x,n,l,r,mid,a,ans:qword;
  i,j:longint;
begin assign(input,'Heart.in');
  assign(output,'Heart.out');
  reset(input);
  rewrite(output);
  readln(n);
  if n<8 then r:=8 else r:=n;
  while l<=r do
   begin
     mid:=(l+r)>>1;
     a:=trunc(ln(mid)/ln(10)*mid)+1;
     if a>=n then
      begin
        ans:=mid;
        r:=mid-1;
      end
     else l:=mid+1;
   end;
  writeln(ans);
  close(input);
  close(output);

end.

(真的很短)

反思:对于数字位数很变态的纯数学问题要考虑ln函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值