问题:
在您选择的语言中,编写最短的函数以返回无符号64位整数的平方根的下限。
测试用例:
您的函数必须在所有输入中均能正常工作,但是这里有一些有助于说明这一点:
INPUT ⟶ OUTPUT
0 ⟶ 0
1 ⟶ 1
2 ⟶ 1
3 ⟶ 1
4 ⟶ 2
8 ⟶ 2
9 ⟶ 3
15 ⟶ 3
16 ⟶ 4
65535 ⟶ 255
65536 ⟶ 256
18446744073709551615 ⟶ 4294967295
规则:
- 您可以随意命名函数。(未命名,匿名或lambda函数可以,只要可以调用即可。)
- 字符计数是此挑战中最重要的,但是运行时也很重要。我敢肯定,您可以使用很少的字符数在O(√n)时间内迭代向上搜索答案,但是O(log(n))时间确实更好(也就是说,假设输入值为n,不是n的位长)。
- 您可能会想使用纯整数和/或布尔算术来实现该功能。但是,如果您确实要使用浮点计算,那么只要您不调用任何库函数就可以了。因此,简单地说
return (n>0)?(uint32_t)sqrtl(n):-1;
C会超出范围,即使它会产生正确的结果。如果您使用浮点运算,您可以使用*
,/
,+
,-
,和幂(例如,**
或者^
如果它是一个内置在你选择的语言操作,但权力的唯一幂比1少)。此限制是为了防止通过调用sqrt()
或变种或将值提高到1/2幂来“作弊” 。 - 如果使用浮点运算(请参阅#3),则不需要返回类型为整数;只是返回值是整数,例如floor(sqrt(n)),并且能够保存任何无符号的32位值。
- 如果您使用的是C / C ++,则可以假定存在无符号的64位和32位整数类型,例如
uint64_t
和uint32_t
所定义stdint.h
。否则,只需确保您的整数类型能够容纳任何64位无符号整数。 - 如果您的语言不支持64位整数(例如,Brainfuck显然仅支持8位整数),请尽力做到这一点,并在答案标题中注明限制。就是说,如果您能弄清楚如何对64位整数进行编码,并使用8位原始算术正确地获取它的平方根,那么将为您提供更多的功能!
- 玩得开心,发挥创造力!
O(log_2 n) === O(log_4 n)
。log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2