我想拿96这样的号码,拨打
squareRoot(96)
,然后得到“4√6”的回报。 但似乎没有任何作用。这让我发疯!我可以提供我写的查找因子的函数,但我认为它们不是特别复杂。
我在这里找到了Python的答案(python,平方根简化函数)并将其翻译成Kotlin:
fun squareRoot(n: Int): Pair<Int, Int> {
var radical = n
var coefficient = 1
for (i in 2..radical) {
if (radical % (i * i) == 0) {
coefficient *= i
radical /= i * i
for (j in 2..radical) {
if (radical % (j * j) == 0) {
coefficient *= j
radical /= j * j
}
}
}
}
return Pair(coefficient, radical)
}
这里是对已接受答案的更正(它给出了
n
被 i^8
整除的错误结果,例如 384)。
关键的区别在于,
if (radical % (i * i) == 0)
条件被替换为while
循环,以便分解出尽可能多的平方的幂。
我还在循环内添加了一个中断条件。在原始代码中,减小
radical
的值可能是为了防止 for
循环执行不必要的次数。但由于 Kotlin for
循环的工作原理,更改循环内 radical
的值不会影响循环的边界。
fun squareRoot(n: Int): Pair<Int, Int> {
var radical = n
var coefficient = 1
for (i in 2..sqrt(radical.toDouble()).toInt()) {
if (i * i > radical) break
while (radical % (i * i) == 0) {
coefficient *= i
radical /= i * i
}
}
return Pair(coefficient, radical)
}