我正在解决代码问题,我必须总结一个大数字的数字(它可以有多达10万个数字),我必须重复这个过程,直到只剩下一个数字并计算我这样做的次数,我想出了一个有效的解决方案,但是我想知道是否有些东西可以用更多的方式完成" Kotlin-ish like way"所以:
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
}
sum = (0 until s.length).sumBy { s[it].toInt() - '0'.toInt() }
有没有办法让我猜测将字符串中的数字之和映射到sum变量,或者通常是比我使用的更好的方法?P.S。我是Kotlin的初学者。
答案 0 :(得分:3)
将Char转换为Int时,它会将其转换为ASCII值,所以我不得不添加“-'0'.toInt()”是否有更快的方式(不是写得太多,要求出于好奇心)?
你可以简单地写s[it] - '0'
,因为在Kotlin中减去Chars已经给你一个Int:
public class Char ... {
...
/** Subtracts the other Char value from this value resulting an Int. */
public operator fun minus(other: Char): Int
...
}
但是为什么在你可以直接遍历Chars时循环遍历索引呢?
sum = s.sumBy { it - '0' }
答案 1 :(得分:1)
这是一种解决它的功能(和递归)风格:
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 }
}
你这样称呼它:
val number = "2937649827364918308623946..." //and so on
val count = sum(number, 0)
希望它有所帮助!