2

我在这里做错了什么?

我想显示 1-100 的整数,这些整数可以被 6 或 7 整除。这已经完成并且可以工作了。下一步是不显示任何可以被两者整除的...这在我的循环中不起作用(那些整数仍在显示)

for (int i = 1; i < 100; i++)
    if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0){
        println(i);
    }

谢谢!乔尔

4

5 回答 5

5

尝试通过添加 (...) 使您的条件更明确,如下所示:


if (((i % 6 == 0 || i % 7 == 0) && (i % (6 * 7) != 0)) {
}

默认情况下 && 优先于 ||

于 2010-03-03T07:40:48.857 回答
3

缺少括号:

for (int i = 1; i < 100; i++) {
    if ((i % 6 == 0 || i % 7 == 0) && i % (6 * 7) != 0) {
        println(i);
    }
}
于 2010-03-03T07:41:31.760 回答
2

我将不再担心如何评估优先级,并使用类似的东西:

for (int i = 1; i <= 100; i++) {
    if ((i % 42) == 0) continue;
    if ((i %  6) == 0) println (i);
    if ((i %  7) == 0) println (i);
}

我在这里假设 1-100 是一个包含范围,在这种情况下你应该使用<=而不是<. 这对您的具体情况无关紧要,因为 100 既不能被 6 也不能被 7 整除。

你猜怎么了?任何体面的优化编译器(包括 JIT 编译器)都可能最终生成与所有其他可能性相同的代码。而且,即使没有,除非您多次调用此函数,否则也没关系

我认为这比以下内容更具可读性:

if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0) ...

或者,更糟糕的是,你必须把它变成类似 Lisp 的东西才能让它正常工作:-)


请记住一种可能性 - 对于 6 和 7 的特定情况,您可以更改循环以使其更高效(七倍),因此:

for (int i = 7; i <= 100; i += 7)
    if ((i % 6) != 0)
        println (i);

这使用for循环本身仅检查 7 的倍数并在它们不是6 的倍数时打印它们。

于 2010-03-03T07:51:46.767 回答
2

您也可以使用独占或

    for (int i = 1; i < 100; i++) {
        if ((i % 6 == 0) ^ (i % 7 == 0)) {
            println(i);
        }
    }

或者只是一个不等,if ((i % 6 == 0) != (i % 7 == 0))
因为独占或不经常使用,我怀疑这会增加代码的可读性......

于 2010-03-03T08:32:12.983 回答
1
for (int i = 1; i < 100; i++)
if ((i % 6 == 0 || i % 7 == 0) && !(i % 6 == 0 && i % 7 == 0)){
    println(i);
}
于 2010-03-03T07:42:01.837 回答