阶乘的最后 3 个非零数字
Last 3 non zero digits from factorial
有人可以帮我看看 java 如何从大阶乘中找到最后 3 个非零数字的示例代码吗?
例如12! :- 479001600 = 16
10! :- 3628800 =288
您可以将数字映射到字符串,遍历数字,找到最多可以找到三个 non-zero 数字的最后一个索引,最后您可以 return 索引并打印最后一位数字作为您的结果。我已经编写了一些代码并编写了方法 findLastIndex
来获取索引:
fun findLastIndex(num: String): Int {
var zero = true
var counter = 0
val reversedNum = num.reversed()
for(i in 0 until num.length){
if(!reversedNum[i].equals('0')){
counter++
zero = false;
}
if((reversedNum[i].equals('0') || counter >= 3) && !zero){
return num.length - i - 1
}
}
return 0
}
现在您可以调用该方法并打印最后 non-zero 位:
val num = 479001600
val numString = num.toString()
val index = findLastIndex(numString)
println(numString.substring(index).replace("0", ""))
您可以在 kotlin playground. Mapping in Java should be easy to do. For the reverse
method you can have a look at the following article 中测试它。或者您可以反转 for 循环。希望对你有帮助。
以下函数计算阶乘:
private static BigInteger factorial(int n) {
return IntStream.rangeClosed(1, n)
.mapToObj(BigInteger::valueOf)
.collect(Collectors.reducing(BigInteger.ONE, BigInteger::multiply));
}
并且此函数计算 最后 3 non-zero 位:
private static BigInteger last3NonzeroDigits(BigInteger n) {
while (n.mod(BigInteger.TEN).equals(BigInteger.ZERO)) {
n = n.divide(BigInteger.TEN);
}
return n.mod(BigInteger.valueOf(1000));
}
- 删除尾随零:当最后一位为 0(可被 10 整除,因此 i % 10 = 0)时,除以 10
- 从结果数字中,提取(最多)最后 3 位数字 (i % 1000)
测试:
for (int i = 1; i <= 15; i++) {
BigInteger f = factorial(i);
System.out.println(i+"! = "+f + " -> " + last3NonzeroDigits(f));
}
输出:
1! = 1 -> 1
2! = 2 -> 2
3! = 6 -> 6
4! = 24 -> 24
5! = 120 -> 12
6! = 720 -> 72
7! = 5040 -> 504
8! = 40320 -> 32
9! = 362880 -> 288
10! = 3628800 -> 288
11! = 39916800 -> 168
12! = 479001600 -> 16
13! = 6227020800 -> 208
14! = 87178291200 -> 912
15! = 1307674368000 -> 368
有人可以帮我看看 java 如何从大阶乘中找到最后 3 个非零数字的示例代码吗? 例如12! :- 479001600 = 16 10! :- 3628800 =288
您可以将数字映射到字符串,遍历数字,找到最多可以找到三个 non-zero 数字的最后一个索引,最后您可以 return 索引并打印最后一位数字作为您的结果。我已经编写了一些代码并编写了方法 findLastIndex
来获取索引:
fun findLastIndex(num: String): Int {
var zero = true
var counter = 0
val reversedNum = num.reversed()
for(i in 0 until num.length){
if(!reversedNum[i].equals('0')){
counter++
zero = false;
}
if((reversedNum[i].equals('0') || counter >= 3) && !zero){
return num.length - i - 1
}
}
return 0
}
现在您可以调用该方法并打印最后 non-zero 位:
val num = 479001600
val numString = num.toString()
val index = findLastIndex(numString)
println(numString.substring(index).replace("0", ""))
您可以在 kotlin playground. Mapping in Java should be easy to do. For the reverse
method you can have a look at the following article 中测试它。或者您可以反转 for 循环。希望对你有帮助。
以下函数计算阶乘:
private static BigInteger factorial(int n) {
return IntStream.rangeClosed(1, n)
.mapToObj(BigInteger::valueOf)
.collect(Collectors.reducing(BigInteger.ONE, BigInteger::multiply));
}
并且此函数计算 最后 3 non-zero 位:
private static BigInteger last3NonzeroDigits(BigInteger n) {
while (n.mod(BigInteger.TEN).equals(BigInteger.ZERO)) {
n = n.divide(BigInteger.TEN);
}
return n.mod(BigInteger.valueOf(1000));
}
- 删除尾随零:当最后一位为 0(可被 10 整除,因此 i % 10 = 0)时,除以 10
- 从结果数字中,提取(最多)最后 3 位数字 (i % 1000)
测试:
for (int i = 1; i <= 15; i++) {
BigInteger f = factorial(i);
System.out.println(i+"! = "+f + " -> " + last3NonzeroDigits(f));
}
输出:
1! = 1 -> 1
2! = 2 -> 2
3! = 6 -> 6
4! = 24 -> 24
5! = 120 -> 12
6! = 720 -> 72
7! = 5040 -> 504
8! = 40320 -> 32
9! = 362880 -> 288
10! = 3628800 -> 288
11! = 39916800 -> 168
12! = 479001600 -> 16
13! = 6227020800 -> 208
14! = 87178291200 -> 912
15! = 1307674368000 -> 368