java - 大数问题
问题描述
我正在尝试用阶乘计算尾随零的数量。
例如
4!= 24 所以你检索到 0。
9!= 362880 所以你检索到 1。
10!= 9!x 10 = 3628800 所以你检索到 2。
11!= 10!x 11 = 3.99168E7 所以你检索到 2。
static double factorial(double n) {
double f = 1;
for(int i = 1 ; i <= n ; i++) {
f *= i;
}
return f;
}
static int numberOfZeros(double f) {
int ten = 1;
int count = 0;
for(;f%Math.pow(10, ten) == 0;count++) {
ten++;
}
return count;
}
在 n 为 22 之前,此代码是可以的。但是当我尝试将 23 放入时,计数为 0。当然,数学上是 23!有尾随零。
解决方案
您不需要计算阶乘来计算尾随零。
看看你可以除以 5 的幂(这是 10 的较大因子)的次数。这是有效的,因为任何尾随零的数字都可以被 10 整除。当 5 多次出现时,您需要使用 5 的幂来捕捉那些时间。
for 45! = 45/25 = 1 + 45/5 = 9 = 10 zeroes.
for 150! = 150/125 = 1 150/25 = 6, 150/5 = 30 so 1 + 6 + 30 = 37 zeros.
现在你所要做的就是编码。
推荐阅读
- outlook - Outlook 生态系统中的 COM 加载项 EOL
- java - 使用 Spring Boot 连接运行 Postgres 的预先存在的 Docker 容器
- reactjs - React Beautiful DnD 无法将项目拖放到列表底部或视口外部
- android - 创建活动日志
- compiler-construction - 为什么 CISC 指令被认为比 RISC 指令更容易/更快地编译?
- identityserver4 - 是否可以设置我自己的本地 IdentityServer 实例
- vb.net - FormClosing 事件上平板电脑和消息框之间的问题
- azure - ARM 模板部署失败(没有为“/MSDeploy”注册路由)
- python - 如何使用 filedialog.askopenfilename() 从 TkInter Python 3 中的另一种方法获取所选文件的路径
- rust - (tokio::spawn) 借用的值不够长——参数要求为 `'static` 借用 `sleepy`