Не знаю насчёт простоты, в Java любой код будет многословным. Вот самое простое, что тут можно родить. Без блока кода, который чудо-программисты "ответов" опять сломали:
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> primes = new ArrayList<>(20);
primes.addAll(Arrays.asList(2, 3, 5, 7));
int step = 2, cand = 11;
while (cand < 100) {
boolean good = true;
for (int j = 2; j < primes.size(); j++) {
int p = primes.get(j);
if (p * p > cand)
break;
if (cand % p == 0) {
good = false;
break;
}
}
if (good)
primes.add(cand);
cand += step;
step = 6 - step;
}
System.out.print("Простые числа до 100:");
for (int p : primes)
System.out.printf(" %d", p);
System.out.println();
while (cand < 142) {
boolean good = true;
for (int j = 2; j < primes.size(); j++) {
int p = primes.get(j);
if (p * p > cand)
break;
if (cand % p == 0) {
good = false;
break;
}
}
if (good)
primes.add(cand);
cand += step;
step = 6 - step;
}
System.out.print("Совершенные числа до 10000:");
for (int p : primes) {
if ((p & (p + 1)) == 0)
System.out.printf(" %d", p * (p + 1) / 2);
}
System.out.println();
}
}
Простые числа ищем перебором простых делителей от 5 до корня из числа (2 и 3 исключаются шагом перебора).
Совершенные числа - это совершенные числа Мерсенна (
https://ru.wikipedia.org/wiki/Совершенное_число ). Находятся перебором ранее найденных простых чисел на соответствие формуле простого числа Мерсенна (2ⁿ - 1). Поскольку искать нужно до 10000, то и набор простых чисел перед этим приходится расширять до 141 = корень из 20000.
Ну а нахождение близнецов - отдельным вопросом давай. И так код еле вмещается в ответ, тут ограничение по длине.