Я могу выбрать 4-х значные варианты за исключением - PullRequest
0 голосов
/ 17 января 2019

Итак, у меня есть домашнее задание, но я не могу понять, почему этот код не работает.

Проблема звучит примерно так:

Создайте код, который проверяет всевозможны вариации четырехзначного числа, но в числе нет трех одинаковых цифр.(я надеюсь, что это имеет смысл)

Мой код:

#include<stdio.h>


int main ()
{
        int i;
        char a,b,c,d;

        for (i=0; i<9999; i++)
        {
                a = i/1000;
                b = i/100%10;
                c = i/10%10;
                d = i%10;

                if (a==b==c)    {i++;}
                else if (b==c==d)       {i++;}
                else if (c==d==a)       {i++;}
                else if (d==a==b)       {i++;}
                else if (a==b==c==d)    {i++;}

                else
                {
                        printf("%d,%d,%d,%d\n", a,b,c,d);
                }
        }
}

Я хочу, чтобы он распечатал что-то вроде этого:

0,0,1,1
0,0,1,2
0,0,1,3
...
0,1,0,9
0,1,1,0
0,1,1,2
...
9,9,8,8

Вместо этого он печатает:

0,1,2,2
0,1,3,3
0,1,4,4
0,1,5,5
0,1,6,6
...
0,8,6,6
0,8,7,7
0,8,8,8
0,8,9,9
0,9,2,2
...
9,9,9,8

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Существует проблема с этими сравнениями:

 if (a==b==c)

Это не выясняет, являются ли a, b и c одинаковыми. Результат == равен 0 или 1, а затем сравнивается с третьим числом. Так, например, если все три числа равны 9, то 9==9==9 превращается в 1==9, то есть 0, поэтому if не берется. Более того, у вас есть ложные срабатывания для таких вещей, как 9==9==1.

Что вам нужно вместо этого, это

if ((a==b) && (a==c))

Теперь вы проверяете, равен ли a b, и когда это так, вы проверяете его с помощью c, и берется if, если они все одинаковые.

Аналогично, конечно, для других сравнений, поэтому вместо else if (a==b==c==d) вы хотите else if ((a==b) && (a==c) && (a==d))

0 голосов
/ 17 января 2019

Как уже отмечалось в других ответах, вы не можете связать операторы сравнения в C и получить ожидаемые результаты. Используйте логические операторы для объединения сравнений. Вероятно, было бы более понятно использовать ||, чтобы избежать всех операторов else.

Существует еще одна существенная проблема с размещенным кодом: i увеличивается каждый раз, когда обнаруживается ошибочный номер. Но затем i снова увеличивается с помощью цикла for. Это приводит к пропуску номера после ошибочного номера, поэтому некоторые нужные номера не будут найдены. Например, 3222 должен завершиться ошибкой, и последующий номер 3223 должен пройти, но этот номер пропускается по опубликованному коду (после исправлений сравнения) со следующим проверяемым номером 3224. Вместо этого просто используйте continue:

if ((a == b && a == c) ||
    (b == c && b == d) ||
    (c == d && c == a) ||
    (d == a && d == b) ||
    (a == b && a == c && a == d)) {
    continue;
} else {
    printf("%d,%d,%d,%d\n", a,b,c,d);
}
0 голосов
/ 17 января 2019

Вы не можете использовать несколько равенств, как это. Вы должны делать их отдельно с условиями и условиями (например, a==b && b==c).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...