【问题描述】
数字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类型数字的精度问题。
数字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类型数字的精度问题。
- public class PowerOfInteger {
- public int greatestPower(String left, String right) {
- long ld = Long.parseLong(left);
- long rd = Long.parseLong(right);
- double lds, rds;
- int k = 1;
- for (int x = 2; x <= ld; x++) {
- lds = getValue(Math.log(ld) / Math.log(x));
- rds = getValue(Math.log(rd) / Math.log(x));
- if (ld == rd && Math.floor(rds) == Math.ceil(rds)) {
- k = (int) rds;
- break;
- }
- k = (int) Math.floor(rds);
- if (k > lds)
- break;
- }
- return k;
- }
- // 由于double类型的数字在计算机中的计算结果不是准确的表示,因此需要对偏差进行处理
- private double getValue(double val) {
- double tmp = val - (int) val;
- if (tmp < 0.000000001)
- return Math.floor(val);
- if (tmp > 0.999999999)
- return Math.ceil(val);
- return val;
- }
- }