Печать чисел, не кратных 7 и 2

Я новичок в 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

Кажется, что оператор И работает так, как я ожидал, что оператор ИЛИ работает, и наоборот. Может кто-нибудь объяснить, что здесь происходит?

Если вы хотите напечатать числа, не кратные 7 И 2, тогда оператор if должен быть if ((i% 7! = 0) && (i% 2! = 0))

Martín Zaragoza 31.07.2018 16:21

Вы не хотите распечатать, если i % 7 равен нулю ИЛИ i % 2 равен нулю. Чтобы отменить это условие, вы можете использовать Законы де Моргана.

Some programmer dude 31.07.2018 16:22

Но разве оператор && не проверяет, выполняются ли оба условия каждым числом, а затем не печатает их?

Ahn 31.07.2018 16:22

14 - единственное число ниже 25, которое является «не кратным или 7 ИЛИ не кратным 2».

marstran 31.07.2018 16:22

Использование оператора или должно быть таким: if (! (I% 7 == 0 || i% 2 == 0))

Martín Zaragoza 31.07.2018 16:23

И при создании Минимальный, полный и проверяемый пример, пожалуйста, копировать вставить в вопросе. Не пытайтесь переписать его, потому что это может по ошибке добавить несвязанные ошибки (или иногда даже исправить по ошибке). Например, вы пишете i%2!=10, когда, скорее всего, имеете в виду i%2!=0.

Some programmer dude 31.07.2018 16:26

Наконец, проведите небольшое исследование о тест Fizz Buzz, вариантом которого является ваша программа.

Some programmer dude 31.07.2018 16:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
2 087
4

Ответы 4

Проверьте свое состояние. Так должно быть:

    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 сделает это уже за вас ...

Torsten Fehre 31.07.2018 16:43

в программе Python:

for n in range(0, 101, 7):
      print(n)

печатает числа, кратные 7, от 0 до 100. Печатайте по одному кратному числу в каждой строке и избегайте печати любых чисел, не кратных 7. Помните, что 0 также кратно 7

Другие вопросы по теме