Topcoder_154

【问题描述】
    数字y=x^k,则y称为x的k次幂。现在给定2个字符串left和right,需要计算最大的k,使得left <= y <= right,(y=x^k)其中x可以为任意整数值。

  定义:
类  PowerOfInteger
方法  public int greatestPower(String left, String right)

  约束:
1、left的取值范围为2至10^12;
2、right的取值范围为left值至10^12。

  测试用例:
1、"5" "20"   Returns: 4
2、"10" "12"   Returns: 1
3、"2" "100"   Returns: 6
4、"1000000000000" "1000000000000"   Returns: 12

注意:主要是需要处理double类型数字的精度问题。
  1. public class PowerOfInteger {
  2.     public int greatestPower(String left, String right) {
  3.         long ld = Long.parseLong(left);
  4.         long rd = Long.parseLong(right);
  5.         double lds, rds;
  6.         int k = 1;
  7.         for (int x = 2; x <= ld; x++) {
  8.             lds = getValue(Math.log(ld) / Math.log(x));
  9.             rds = getValue(Math.log(rd) / Math.log(x));
  10.             if (ld == rd && Math.floor(rds) == Math.ceil(rds)) {
  11.                 k = (int) rds;
  12.                 break;
  13.             }
  14.             k = (int) Math.floor(rds);
  15.             if (k > lds)
  16.                 break;
  17.         }
  18.         return k;
  19.     }
  20.     // 由于double类型的数字在计算机中的计算结果不是准确的表示,因此需要对偏差进行处理
  21.     private double getValue(double val) {
  22.         double tmp = val - (int) val;
  23.         if (tmp < 0.000000001)
  24.             return Math.floor(val);
  25.         if (tmp > 0.999999999)
  26.             return Math.ceil(val);
  27.         return val;
  28.     }
  29. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值