一般较复杂的写法:
public static void main(String[] args) {
for (int i = 100; i < 10000; i++) {
if (i % 2 ==0) {
if (i % 3 ==0) {
if (i % 4 ==0) {
if (i % 5 ==0) {
if (i % 6 ==0) {
if (i % 7 ==0) {
if (i % 8 ==0) {
if (i % 9 ==0) {
System.out.println(i);
break;
}
}
}
}
}
}
}
}
}
}
1、优化比较算法
可以通过在%
操作符右侧放置2
到9
的来一次测试所有这些可能情况
if (i % (2 * 3 * 4 * 5 * 6 * 7 * 8 * 9) == 0)
但由于某些数字包括其分解中的先前数字,因此应使用较低的数字,特别是最小公倍数。8
是2
和4
的倍数,9
是3
的倍数,如果产品中有8
和9
,则也覆盖6
(2 * 3
)。
if (i % (5 * 7 * 8 * 9) == 0)
结果是2520
,这是最不常见的倍数。使用它会更具可读性
/**
* 目标是测试这个数字是否是所有整数的倍数
* 从2点到9点。从数学上讲,a的最小公倍数是a
* 所有输入数的倍数。这里,LCM(2,3)…9等于2520。
*/
public static final int LCM_2_THRU_9 = 2520;
定义一个常量,我会在这里使用它:
if (i % LCM_2_THRU_9 == 0)
2、使用IntStream实现
for (int i = 100; i < 10000; ++i) {
int x = i;
if (IntStream.of(2, 3, 4, 5, 6, 7, 8, 9).allMatch(k -> x % k == 0)) {
System.out.println(i);
break;
}
}
-> 2520
或
int result = IntStream
.range(100, 10000)
.filter(i -> IntStream.of(2, 3, 4, 5, 6, 7, 8, 9).allMatch(k -> i % k == 0))
.findFirst()
.getAsInt();
System.out.println(result);
或
import java.util.stream.IntStream; public static void main(String[] args) { for (int i = 100; i < 10000; i++) { int x = i; // x is effectively final if (IntStream.rangeClosed(2, 9).allMatch(n -> x % n == 0)) { System.out.println(i); break; } } }
-> 2520
3、使用&&合成一个条件
public static void main(String[] args) { for (int i = 100; i < 10000; i++) { if (isPrintable(i)) { System.out.println(i); break; } } } private static boolean isPrintable(int value) { return value % 2 == 0 && value % 3 == 0 && value % 4 == 0 && value % 5 == 0 && value % 6 == 0 && value % 7 == 0 && value % 8 == 0 && value % 9 == 0; }
4、通过for循环
public static boolean isDivisible(int number) {
for (int i = 2; i <= 9; i++) {
if (num % i != 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
for (int i = 100; i <= 100000; i++) {
if (isDivisible(i)) {
System.out.println("Divisible by numbers 2...9: " + i);
break;
}
}
}