【发布时间】:2023-03-20 11:10:02
【问题描述】:
我正在解决 spoj 平台上的任务 - 计算阶乘中的位数。 我找到了 Kamenetsky 公式并实现了它:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int numOfTests = Integer.parseInt(in.readLine());
for(int i = 0; i < numOfTests; i++) {
System.out.println(KamenetskyFormula(Integer.parseInt(in.readLine())));
}
/*
in.lines()
.limit(numOfTests)
.map(n -> Integer.parseInt(n))
.forEach(n -> System.out.println(KamenetskyFormula(n)));*/
}
private static long KamenetskyFormula(int n) {
if (n < 2) {
return 1;
}
double x = n * Math.log10(n / Math.E) + Math.log10(2 * Math.PI * n) / 2.0;
return (long) (Math.floor(x) + 1);
}
}
首先我使用了注释代码(流),因为我认为它比实际代码(没有 cmets)慢,所以我进行了更改,但仍然超过了时间限制。我怎样才能让它更快?
示例输入是(第一行是测试数):
3
1
10
100
和预期的输出:
1
7
158
【问题讨论】:
-
我认为这段代码没有太大的改进空间。使用一些日志标识和预先计算,公式可以写成只需要一次日志计算而不是两次的形式。但是对于少量的测试用例,这并不重要。也许还有其他更有效的方法。
-
需要多快?我做了一个快速检查,您的代码(大约)立即完成,即使添加 1000 个代码也是如此。
-
@Yonas Limit czasu wykonania programu: 0.303s 这意味着,程序执行超时:0.303s 我检查了这个任务的解决方案的历史,一个人用 Java 解决了它,所以它是可能的
标签: java algorithm math optimization factorial