在此程序中,您将学习在Kotlin中使用for和while循环查找数字的阶乘。您还将学习使用 range 来解决此问题。
正数的阶乘由下式n给出:
factorial of n (n!) = 1 * 2 * 3 * 4 * ... * n
fun main(args: Array<String>) { val num = 10 var factorial: Long = 1 for (i in 1..num) { // factorial = factorial * i; factorial *= i.toLong() } println("$num 的阶乘 = $factorial") }
运行该程序时,输出为:
10 的阶乘 = 3628800
在此程序中,我们使用循环来循环遍历1至给定数字num(10)之间的所有数字,将每个数字的相乘直到num,并存储在变量 factorial 中。
与Java不同,在Kotlin中,您可以使用range(1..num)和in 运算符在1到num 之间的数字之间循环。
同样,我们使用long而不是int,是为了存储数字较大的阶乘结果。
但是,它有可能仍然不足以存储较大数字的值(例如1...100)。对于不能存储在 long 变量中的结果,我们使用在java.math库中声明的 BigInteger 变量。
这是等效的Java代码:查找数字阶乘的Java程序。
import java.math.BigInteger fun main(args: Array<String>) { val num = 30 var factorial = BigInteger.ONE for (i in 1..num) { // factorial = factorial * i; factorial = factorial.multiply(BigInteger.valueOf(num.toLong())) } println("$num 的阶乘 = $factorial") }
运行该程序时,输出为:
30 的阶乘 = 205891132094649000000000000000000000000000000
这里,我们用BigInteger变量的阶乘代替long。
由于 * 运算符不能与BigInteger一起使用,我们对乘积使用multiply()。另外,num应该被转换为BigInteger以进行乘法运算。
同样,我们也可以使用while循环来解决此问题。
fun main(args: Array<String>) { val num = 5 var i = 1 var factorial: Long = 1 while (i <= num) { factorial *= i.toLong() i++ } println("$num的阶乘 = $factorial") }
运行该程序时,输出为:
5 的阶乘 = 120
在上面的程序中,与for循环不同,我们必须增加循环体内 i 的值。
尽管两个程序在技术上都是正确的,但在这种情况下最好使用for循环。这是因为迭代次数(最大为num)是已知的。