Код, содержащий побитовые операторы, не проходит тестовые случаи - PullRequest
1 голос
/ 15 июня 2019

У меня есть задача:

Заданный набор S = {1,2,3,..., n}, найти:

  • максимальное значение a&b, которое меньше заданногоцелое число k, где a и b (где a < b) - два целых числа из набора S.

  • максимальное значение a|b, которое меньшечем указанное целое число k, где a и b (где a < b) - два целых числа из множества S.

  • максимальное значение a^bкоторое меньше заданного целого числа k, где a и b (где a < b) - два целых числа из множества S.

Myкод не работает, хотя я не могу найти ошибку

Есть следующий тестовый пример:

Ввод: 5 4

Выход:

2
3
3

Однако мой вывод:

1382045904
24
3

Мой код:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

void calculate_the_maximum(int n, int k) {
    int max_and, max_or, max_xor = -1;

    for (int a = 0; a < n; a++) {
        for (int b = a + 1; b <= n; b++) {
            int currently_and = a & b, currently_or = a | b, currently_xor = a ^ b;

            if ((max_and < currently_and) && (currently_and < k)) {
                max_and = currently_and;
            }
            if ((currently_or > max_or) && (currently_or < k)) {
                max_or = currently_or;
            }
            if ((currently_xor > max_xor) && (currently_xor < k)) {
                max_xor = currently_xor;
            }
        }
    }

    printf("%d\n%d\n%d\n", max_and, max_or, max_xor);
}

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

max_and и max_or не инициализированы .

Неинициализированные значения в C содержат значение мусора, которое обычно представляет собой большое положительное целое число.

Инициализируйте их равными 0. Также рекомендуется использовать тип long , так как вычисленные значения могут стать очень большими.

long int max_and = 0 и long int max_or = 0

0 голосов
/ 15 июня 2019

max_and и max_or не инициализируются в вашем коде, поэтому они содержат значения мусора.

Более конкретно,

  int max_and, ...
  for(int a = 0; a < n; a++){
      for(int b = a + 1; b <= n; b++){
          int currently_and = a & b, currently_or = a | b, currently_xor = a ^ b;
          if ((max_and < ...

пытается прочитать из max_and до того, как оно было установлено. Получает доступ к неопределенному значению, поэтому код имеет неопределенное поведение.

...