包含按位运算符的代码无法通过测试用例

时间:2019-06-15 11:20:44

标签: c bitwise-operators

我有任务:

  

给定S = {1,2,3,..., n},找到:

     
      
  • a&b的最大值小于给定的整数k,其中ab(其中a < b)是两个集合S中的整数。

  •   
  • a|b的最大值小于给定的整数k,其中ab(其中a < b)是两个集合S中的整数。

  •   
  • a^b的最大值小于给定的整数k,其中ab(其中a < b)是两个集合S中的整数。

  •   

尽管我找不到错误,但我的代码无法工作

有以下测试案例:

输入: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 :(得分:0)

max_andmax_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进行读取。这将访问不确定的值,因此代码具有未定义的行为。

答案 1 :(得分:0)

max_andmax_or未初始化

C中未初始化的值包含垃圾值,该值通常是一些大的正整数。

将它们初始化为0。此外,建议使用 long 类型,因为评估值可能会变得很大。

long int max_and = 0long int max_or = 0