求一个数字的最小绝对差值,该数字的形式为b ^ x,其中b,x> 1

时间:2016-08-13 16:56:49

标签: algorithm math

考虑一个示例70,其中最接近的数字是64,即2^6。所以最小绝对差值为6 对这类问题(lg n时间复杂度)的好方法是什么?
编辑:bxintegers
编辑:1 < n < 10^9其中n是必须找到最小绝对差值的数字。假设q查询即将到来且1 < q < 10^5

2 个答案:

答案 0 :(得分:6)

你可以找到你的数字的第k个根,对于所有合理的k值,向上和向下舍入,找到哪个产生最接近n的值。

一旦n的第k个根小于2,就可以停止这个算法,这意味着要找到O(log n)个根。

以下是一些实现此功能的Python代码:

int(pow(n, 1/k)) == 1

当k最多为lg(n)+1时发生终止条件FILE* output_file = safe_open_file("task_1_bst.csv", "w"); fprintf(output_file, "timestamp,latitude,longitude,magnitude\n"); eq_print(output_file, sorted_arr[longest_index-1]); fprintf(output_file, "\n"); eq_print(output_file, sorted_arr[longest_index-1]); fprintf(output_file, "\n"); eq_print(output_file, sorted_arr[longest_index]); fclose(output_file); ,因此该算法为O(log n),假设math.pow为O(1)。

答案 1 :(得分:3)

我有一个O(sqrt(n))复杂度的解决方案。对于给定的数字n,请k = ceil(sqrt(n))。现在,可以使用以下Python代码计算最小绝对差值:

import math
n = int(raw_input('Enter a number: '))
k = int(math.sqrt(n))
minimum = 2147486347
for i in range(2, k+1):
    p = int(math.log(n)/math.log(i))

    if p > 1:
        minimum = min(minimum, abs(n-i**p))
    if p >= 1:
        minimum = min(minimum, abs(n-i**(p+1)))


print minimum