Я новичок в java, и я оказался в некоторой головоломке. Моя логика для решения вопроса верна, но мои логические операторы работают не так, как я ожидал. Вот программа, которую я написал:
public class idgaf {
public static void main(String[] args) {
int n=25;
for(int i=1;i<=n;i++){
if ((i%7!=0)||(i%2!=0)){
System.out.print(i+" ");
}
}
}
Выход: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Я ожидал, что оператор ИЛИ сделает свое дело и не покажет никаких чисел, кратных 7 и 2, но, тем не менее, единственное удаленное число - 14, что кратно как 7, так и 2. Я попробовал тот же код с оператором И и дал правильный результат.
Вывод с оператором AND: 1 3 5 9 11 13 15 17 19 23 25
Кажется, что оператор И работает так, как я ожидал, что оператор ИЛИ работает, и наоборот. Может кто-нибудь объяснить, что здесь происходит?
Вы не хотите распечатать, если i % 7 равен нулю ИЛИ i % 2 равен нулю. Чтобы отменить это условие, вы можете использовать Законы де Моргана.
Но разве оператор && не проверяет, выполняются ли оба условия каждым числом, а затем не печатает их?
14 - единственное число ниже 25, которое является «не кратным или 7 ИЛИ не кратным 2».
Использование оператора или должно быть таким: if (! (I% 7 == 0 || i% 2 == 0))
И при создании Минимальный, полный и проверяемый пример, пожалуйста, копировать вставить в вопросе. Не пытайтесь переписать его, потому что это может по ошибке добавить несвязанные ошибки (или иногда даже исправить по ошибке). Например, вы пишете i%2!=10, когда, скорее всего, имеете в виду i%2!=0.
Наконец, проведите небольшое исследование о тест Fizz Buzz, вариантом которого является ваша программа.




Проверьте свое состояние. Так должно быть:
if ((i%7 != 0) && (i%2 != 0)){ .....
i%7!=0 // нельзя делить на 7
i%2!=0 // нельзя делить на 2
присоединитесь к ним с помощью AND, и вы получите правильный результат
Правильная версия будет
public class idgaf {
public static void main(String[] args) {
int n = 25;
for (int i = 1; i <= n; i++) {
// here are two adjustments, && instead of || and % 2 != 0 (not 10)
if ((i % 7 != 0) && (i % 2 != 0)) {
System.out.print(i + " ");
}
}
}
}
Попробуй что-нибудь новое?
Что-то вроде этого с использованием java 8, который просто вернет верхние целые числа k, которые соответствуют вашим требованиям:
public static void main(String... args) {
System.out.println(getTopK(10));
}
private static List<Integer> getTopK(int k) {
return IntStream.range(0, Integer.MAX_VALUE)
.filter(i -> i % 7 != 0 && i % 2 != 0)
.limit(k).boxed()
.collect(Collectors.toList());
}
И вывод, если k = 10 будет:
[1, 3, 5, 9, 11, 13, 15, 17, 19, 23]
Возможно, вы можете немного ускорить это, заменив i % 7 != 0 && i % 2 != 0 на i % 14 != 0, но, возможно, компилятор JIT сделает это уже за вас ...
в программе Python:
for n in range(0, 101, 7):
print(n)
печатает числа, кратные 7, от 0 до 100. Печатайте по одному кратному числу в каждой строке и избегайте печати любых чисел, не кратных 7. Помните, что 0 также кратно 7
Если вы хотите напечатать числа, не кратные 7 И 2, тогда оператор if должен быть if ((i% 7! = 0) && (i% 2! = 0))