在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
    运算符
  • 范围到
    功能

    这里我定义了一个for
    biginger

    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非常灵活,允许我们迭代任何内容,但这可能不是解决问题的最佳方法