我想知道这段代码是否可以用任何方式进行优化?例如,我可以在这里使用一个For每个循环吗?有没有其他方法可以让我更容易理解这篇文章,或者是阅读它的人?
public static void printFactors(int factorsOf) {
for (int i = 1; i < factorsOf; i++) {
if(factorsOf % i == 0) {
System.out.print(i + " and ");
}
}
System.out.print(factorsOf);
}发布于 2015-06-25 21:36:45
在每个循环中使用打印将是缓慢的。它们太多了,而打印的速度本来就很慢,因为它们被IO绑定,需要锁和同步等等。
此外,每个可能的因素的循环也是缓慢的。有更快的方法来识别一个数字的因素,这是另一个讨论(维基百科有一个很好的页面)。
所以,在不改变你的算法的情况下,我仍然会做一些改变。
我要做的第一件事就是打开一个函数来计算因子的整数数组。它看起来应该是:
public static final int[] factors(final int factorsOf) {
return IntStream.rangeClosed(1, factorsOf)
.filter(f -> factorsOf % f == 0)
.toArray();
}这是Java 8流,但是逻辑应该比较清楚。循环从1到factorsOf,保留那些实际因素的值,并将这些因素转换成一个int[]数组。
这是一个单一用途的函数,让它变得清晰,并且可重用。
现在,创建一个函数,将整数数组转换为“和”分隔的字符串.类似于:
public static final String joinInts(int[] values, String joiner) {
StringJoiner sj = new StringJoiner(joiner);
for (int v : values) {
sj.add(Integer.toString(v));
}
return sj.toString();
}然后,将所有这些用作:
System.out.println(joinInts(factors(100), " and "));发布于 2015-06-25 21:51:15
只是一个小小的音符:
在数论中,整数分解是将一个复合数分解成一个较小整数的乘积。
因此,12的因式分解可能是
6 * 2或
3 * 2 * 2但不是
1 and 2 and 3 and 4 and 6 and 12您所做的是找到所有的除数,您应该适当地命名您的方法。
和往常一样,计算和打印的方法都是不可用的。您应该始终在一个方法中计算结果,以便以后可以打印或进一步处理它。
对于像你这样的简单方法来说,这并不重要,但这是个好习惯。
发布于 2015-06-26 01:13:29
一旦您发现i是一个因素,您就知道factorsOf / i也是一个因素。这意味着for循环不需要超过factorsOf的平方根。例如,使用75,就会立即得到1、3和5的早期因子75、25和15的互补因子。检查i值高于9(略高于sqrt(75))是没有意义的。这将节省大量factorsOf值的测试,因为1到sqrt(n)的元素比sqrt(n)通过n的元素少得多。如果需要所有的因素,您可以将早期的因素及其互补因素存储在数组中,并在以后对其进行排序。
https://codereview.stackexchange.com/questions/94692
复制相似问题