你能映射/减少一个字符串到一个Int?

我正在解决一个代码中的问题,我必须总结一个大数字(最多可以有10万位数字)的数字,我不得不重复这个过程直到只剩下一个数字,有一次,我做了这个,我想出了一个工作的解决方案,但是我想知道是否有些事情可以用更像“Kotlin-ish”的方式来完成,所以给出:

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() }有没有办法让我猜映射字符串中的数字总和的总和变量,或总的来说,比我使用的方法更好?
  2. 当把一个字符转换成一个INT时,它将它转换为ASCII值,所以我不得不添加“-'0'.Int()”有没有更快的方法(不是写太多了,要求出于好奇)?
  3. 如何使字符串n可变,而不创建一个新的字符串和操纵它? 还是那个想要的(也是唯一的)方法?

PS我是Kotlin的初学者。

当把一个字符转换成一个INT时,它将它转换为ASCII值,所以我不得不添加“-'0'.Int()”有没有更快的方法(不是写太多了,要求出于好奇)?

你可以简单地写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 ... } 

但是,为什么循环索引时,你可以直接循环的字符?

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

这是一个功能(和递归)的风格来解决它:

 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) 

希望它有帮助!