有一个正方形序列:149162536(1 4 9 16 25 36 ...) 如何获得具有n位数的数字?例如:n = 5,答案6。n= 2,答案4。n= 9,答案6。
答案 0 :(得分:1)
采用蛮力解决方案似乎很容易:
i = 0
开头。i*i
并使用snprintf
转换为字符串。假设len
是此字符串的长度。n >= len
递增i
,请从len
中减去n
,然后继续执行步骤2。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)。