如何计算正方形序列中的位数

时间:2019-11-11 13:47:50

标签: c

有一个正方形序列:149162536(1 4 9 16 25 36 ...) 如何获得具有n位数的数字?例如:n = 5,答案6。n= 2,答案4。n= 9,答案6。

1 个答案:

答案 0 :(得分:1)

采用蛮力解决方案似乎很容易:

  1. i = 0开头。
  2. 计算i*i并使用snprintf转换为字符串。假设len是此字符串的长度。
  3. 如果n >= len递增i,请从len中减去n,然后继续执行步骤2。
  4. 否则,返回偏移量为n的字符串的字符。

以下是一些代码:

int find_char_in_square_sequence(unsigned long long n) {
    for (unsigned long long i = 0;; i++) {
        char buf[32];
        unsigned int len = snprintf(buf, sizeof buf, "%llu", i * i);
        if (n < len)
            return buf[n] - '0';
        n -= len;
    }
}

对于大的索引值,一种更有效的方法将一步处理具有相同大小的平方的值范围,从而将时间复杂度从 O(N log N)降低到正好< strong> O(日志N)。