在Kotlin中使用foreach循环BigInteger值
我试图使用下面的代码片段循环在Kotlin中使用foreach循环BigInteger值,kotlin,Kotlin,我试图使用下面的代码片段循环biginger中的Kotlin值。但它告诉For循环范围必须有一个“iterator()”方法。如何循环Kotlin中的biginger值 private fun pow(base: BigInteger, power: BigInteger): String { for(i in BigInteger.ZERO..power){ //Giving error } } 您可以扩展以允许这样做 我们尤其需要: 将rangeT
biginger
中的Kotlin
值。但它告诉For循环范围必须有一个“iterator()”方法。如何循环Kotlin
中的biginger
值
private fun pow(base: BigInteger, power: BigInteger): String {
for(i in BigInteger.ZERO..power){ //Giving error
}
}
您可以扩展以允许这样做
我们尤其需要:
将rangeTo
函数引入BigInteger
(允许使用。
运算符
)
将迭代器
函数添加到rangeTo
运算符
范围到
功能
这里我定义了一个forbiginger
operator fun BigInteger.rangeTo(other: BigInteger) =
BigIntegerRange(this, other)
BigIntegralErrange
:
class BigIntegerRange(
override val start: BigInteger,
override val endInclusive: BigInteger
) : ClosedRange<BigInteger>, Iterable<BigInteger> {
override operator fun iterator(): Iterator<BigInteger> =
BigIntegerRangeIterator(this)
}
class BigIntegerRangeIterator(
private val range: ClosedRange<BigInteger>
) : Iterator<BigInteger> {
private var current = range.start
override fun hasNext(): Boolean =
current <= range.endInclusive
override fun next(): BigInteger {
if (!hasNext()) {
throw NoSuchElementException()
}
return current++
}
}
现在这个代码:
fun main() {
for (i in BigInteger.ZERO..BigInteger.TEN) {
println(i)
}
}
汇编和打印:
0
1
2
3
4
5
6
7
8
9
10
不要忘记使用rangeTo
功能
另见:
class BigIntegerRange(
override val start: BigInteger,
override val endInclusive: BigInteger
) : ClosedRange<BigInteger>, Iterable<BigInteger> {
override operator fun iterator(): Iterator<BigInteger> =
BigIntegerRangeIterator(this)
}
class BigIntegerRangeIterator(
private val range: ClosedRange<BigInteger>
) : Iterator<BigInteger> {
private var current = range.start
override fun hasNext(): Boolean =
current <= range.endInclusive
override fun next(): BigInteger {
if (!hasNext()) {
throw NoSuchElementException()
}
return current++
}
}
电源
作为大整数
?如果您放松约束,可以在biginger
上使用内置的pow
函数:base.pow(Int)
不,我不能。函数参数非常大。这就是我们要走的路。你是说Kotlin
没有为我们提供一种使用for循环迭代biginger
值的方法@Todd虽然@caco3提供的答案是编写大整数范围的好方法,但我认为您确实需要重新评估您对这个问题的假设。Long.MAX_值为2^63-1,这是不必切换到biginger
即可使用的最大数字。现在,我知道您的计算结果可能会超过Long.MAX_值,但在循环中以如此大的指数进行迭代计算将花费许多人的生命。请重新考虑您的假设,看看您是否可以使用内置函数来完成此操作!事实上,biginger.pow
将int
作为参数,而不是biginger
(甚至在中提到)可能会证实@Tedd的话。尽管Kotlin非常灵活,允许我们迭代任何内容,但这可能不是解决问题的最佳方法