2017-10-30 2 views
1

Ich löste ein Problem mit Codeforces, in dem ich die Ziffern einer großen Zahl zusammenfassen musste (es kann bis zu 100k Ziffern haben) und ich müsste diesen Vorgang wiederholen, bis nur noch eine Ziffer übrig ist und zähle die ich einige Male tat, und ich kam mit einer Arbeitslösung auf, aber ich würde gerne wissen, ob einige Dinge in einem „Kotlin-ish wie Art und Weise“, so gegeben hätte getan werden können:Können Sie einen String in einen Int abbilden/reduzieren?

fun main(args: Array<String>) { 
    println(transform(readLine()!!)) 
} 

fun transform(n: String): Int { 
    var count = 0 
    var sum : Int 
    var s = n 
    while(s.length > 1) { 
     sum = (0 until s.length).sumBy { s[it].toInt() - '0'.toInt() } 
     s = sum.toString() 
     count++ 
    } 
    return count 
} 
  1. sum = (0 until s.length).sumBy { s[it].toInt() - '0'.toInt() } gibt es eine Möglichkeit, die Summe der Ziffern in der Zeichenfolge auf die Summenvariable abzubilden, oder im Allgemeinen eine bessere Herangehensweise als die, die ich verwendet habe?
  2. Wenn ich ein Char in ein Int umwandle, wird es in den ASCII-Wert konvertiert, also musste ich "-'0'toInt()" hinzufügen, gibt es einen schnelleren Weg (nicht dass es zu viel zu schreiben ist))
  3. Wie macht man den String n änderbar, ohne einen neuen String zu erstellen und ihn zu manipulieren? Oder ist das der gewünschte (und einzige) Weg?

P.S. Ich bin ein Anfänger mit Kotlin.

+1

's.map {" $ it ".toInt()} .sum()' gibt die Summe der Ziffern zurück –

Antwort

3

Wenn ein Char in Int konvertiert es wandelt es in dem ASCII-Wert, also musste ich hinzufügen „-'0'.toInt()“ gibt es einen schnelleren Weg (nicht, dass es zu viel zu schreiben, zu fragen aus Neugier)?

Sie können einfach s[it] - '0' schreiben, weil Subtrahieren Chars in Kotlin bereits Sie eine Int gibt: direkt

public class Char ... { 
    ... 
    /** Subtracts the other Char value from this value resulting an Int. */ 
    public operator fun minus(other: Char): Int 
    ... 
} 

Aber warum in den Indizes werden Looping, wenn Sie Schleife über die Chars könnte?

sum = s.sumBy { it - '0' } 
0

Dies ist eine funktionell ist (und rekursiv) Stil, es zu lösen:

private fun sum(num: String, count: Int) : Int { 
    return num 
     //digit to int 
     .map { "$it".toInt() } 
     //sum digits 
     .sum() 
     //sum to string 
     .toString() 
     //if sum's length is more than one, do it again with incremented count. Otherwise, return the current count 
     .let { if (it.length > 1) sum(it, count + 1) else count } 
} 

Und Sie es so nennen:

val number = "2937649827364918308623946..." //and so on 
val count = sum(number, 0) 

Hoffe, es hilft!

Verwandte Themen