loop sui valori di BigInteger utilizzando il foreach in Kotlin

sto cercando di loop oltre BigInteger valori in Kotlin utilizzando il seguente frammento di codice. ma sta dicendo For-loop range must have an 'iterator()' method. come posso eseguire il loop sui valori BigInteger in Kotlin?

private fun pow(base: BigInteger, power: BigInteger): String {
        for(i in BigInteger.ZERO..power){ //Giving error

        }
    }

EN From: loop over BigInteger values using foreach in Kotlin

More similar articles:

6 Comments

  1. hai davvero bisogno di avere il power come BigInteger? se si rilassano i vincoli, è possibile utilizzare il built-in funzione pow su BigInteger: base.pow(Int)

  2. no, non posso. i parametri di funzione sono davvero enormi. così è la strada da percorrere. quindi si intende Kotlin non ci fornisce un modo per iterare attraverso BigInteger valori utilizzando per ciclo? @Todd

  3. è possibile estendere BigInteger per consentire questo

    in particolare dobbiamo:

    1. introdurre la funzione rangeTo a BigInteger (per consentire di usare .. operator)
    2. aggiungere la funzione iterator all’intervallo restituito da rangeTo operator

    la funzione rangeTo

    qui sto definendo una funzione di estensione per BigInteger

    operator fun BigInteger.rangeTo(other: BigInteger) = 
            BigIntegerRange(this, other)

    BigIntegerRange:

    class BigIntegerRange(
            override val start: BigInteger,
            override val endInclusive: BigInteger
    ) : ClosedRange<BigInteger>, Iterable<BigInteger> {
        override operator fun iterator(): Iterator<BigInteger> =
                BigIntegerRangeIterator(this)
    }

    BigIntegerRangeIterator:

    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++
        }
    }

    ora questo codice:

    fun main() {
        for (i in BigInteger.ZERO..BigInteger.TEN) {
            println(i)
        }
    }

    compila e stampa:

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    non dimenticare di import la funzione rangeTo

    vedi anche:

  4. mentre la risposta fornita da @caco3 è un bel modo per scrivere una gamma BigInteger, Penso che davvero bisogno di rivalutare le ipotesi qui per questo problema. Long.MAX VALUE è 2 ^ 63-1, il numero più grande che è possibile utilizzare senza dover passare a BigInteger. ora, capisco che la * risposta * al vostro calcolo potrebbe superare il VALORE DI Long.MAX, ma calcolando iterativamente in un ciclo con un esponente che grande richiederà molte vite umane. per favore, riconsiderare le vostre ipotesi e vedere se è possibile utilizzare la funzione integrata per questo!

  5. il fatto che BigInteger.pow prenda un int come argomento piuttosto che BigInteger (si nota anche nel javadoc) può confermare le parole di @Tedd. anche se Kotlin è così flessibile che ci permette di iterare su tutto ciò che può non essere il modo migliore per risolvere il problema che hai

Leave a Reply

Your email address will not be published. Required fields are marked *