首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fencepost循环的数字打印因子

使用fencepost循环的数字打印因子
EN

Code Review用户
提问于 2015-06-25 20:58:28
回答 5查看 1.4K关注 0票数 2

我想知道这段代码是否可以用任何方式进行优化?例如,我可以在这里使用一个For每个循环吗?有没有其他方法可以让我更容易理解这篇文章,或者是阅读它的人?

代码语言:javascript
复制
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);
}
EN

回答 5

Code Review用户

回答已采纳

发布于 2015-06-25 21:36:45

在每个循环中使用打印将是缓慢的。它们太多了,而打印的速度本来就很慢,因为它们被IO绑定,需要锁和同步等等。

此外,每个可能的因素的循环也是缓慢的。有更快的方法来识别一个数字的因素,这是另一个讨论(维基百科有一个很好的页面)。

所以,在不改变你的算法的情况下,我仍然会做一些改变。

我要做的第一件事就是打开一个函数来计算因子的整数数组。它看起来应该是:

代码语言:javascript
复制
public static final int[] factors(final int factorsOf) {
    return IntStream.rangeClosed(1, factorsOf)
            .filter(f -> factorsOf % f == 0)
            .toArray();
}

这是Java 8流,但是逻辑应该比较清楚。循环从1到factorsOf,保留那些实际因素的值,并将这些因素转换成一个int[]数组。

这是一个单一用途的函数,让它变得清晰,并且可重用。

现在,创建一个函数,将整数数组转换为“和”分隔的字符串.类似于:

代码语言:javascript
复制
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();
}

然后,将所有这些用作:

代码语言:javascript
复制
    System.out.println(joinInts(factors(100), " and "));
票数 4
EN

Code Review用户

发布于 2015-06-25 21:51:15

只是一个小小的音符:

在数论中,整数分解是将一个复合数分解成一个较小整数的乘积。

因此,12的因式分解可能是

代码语言:javascript
复制
6 * 2

代码语言:javascript
复制
3 * 2 * 2

但不是

代码语言:javascript
复制
1 and 2 and 3 and 4 and 6 and 12

您所做的是找到所有的除数,您应该适当地命名您的方法。

和往常一样,计算和打印的方法都是不可用的。您应该始终在一个方法中计算结果,以便以后可以打印或进一步处理它。

对于像你这样的简单方法来说,这并不重要,但这是个好习惯。

票数 5
EN

Code Review用户

发布于 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的元素少得多。如果需要所有的因素,您可以将早期的因素及其互补因素存储在数组中,并在以后对其进行排序。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/94692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档