首页 > 解决方案 > 仅具有位运算符的 C 程序可在调试语句中正确运行

问题描述

我正在尝试解决这个挑战:

任务: 给定集合 S = {1, 2, 3, ...n},求:

输入格式:唯一的一行包含 2 个空格分隔的整数,分别为nk

我编写了这个 C 程序来尝试解决它。

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

void calculate_the_maximum(int n, int k) {
    int i, j = 1;
    int maxAND, maxOR, maxXOR = 0;
    int AND, OR, XOR = 0;

    for (i = 1; i <= n; i++) {
        for (j = i + 1; j <= n; j++) {
            AND = (i & j); OR = (i | j); XOR = (i ^ j);
            if (AND > maxAND && AND < k) { maxAND = AND; }
            if (OR > maxOR && OR < k) { maxOR = OR; }
            if (XOR > maxXOR && XOR < k) { maxXOR = XOR; }
        }
    }

    printf("%d\n%d\n%d", maxAND, maxOR, maxXOR);
}

int main() {
    int n, k;

    scanf("%d %d", &n, &k);
    calculate_the_maximum(n, k);

    return 0;
}

在我看来,这应该可以工作,不幸的是,它打印出来了

2
24
3

而不是我的预期

2
3
3

更奇怪的是,有时程序会打印出一个看似随机的 maxAND 数,看起来像

1910024400
24
3

这很糟糕:当我每次包含调试语句时,程序都会打印出我所期望的内容。如果我添加这个

printf("I: %d J: %d OR: %d\n", i, j, OR);
在第 13 行,程序现在打印出

我:1 焦:2 或:3
我:1 焦:3 或:3
我:1 焦:4 或:5
我:1 焦:5 或:5
我:2 焦:3 或:3
我:2 焦:4 或:6
我:2 焦:5 或:7
我:3 焦:4 或:7
我:3 焦:5 或:7
我:4 焦:5 或:5
2
3
3

这正是我所期望的。任何想法为什么这个程序只输出我期望的包含额外的 printf 的?

标签: cfor-loopprintfbitwise-operators

解决方案


您的max变量在循环开始之前未初始化。它应该是:

void calculate_the_maximum(int n, int k) {
    int i, j = 1;
    int maxAND = 0, maxOR = 0, maxXOR = 0;
    int AND, OR, XOR = 0;

    for (i = 1; i <= n; i++) {
        for (j = i + 1; j <= n; j++) {
            AND = (i & j); OR = (i | j); XOR = (i ^ j);
            if (AND > maxAND && AND < k) { maxAND = AND; }
            if (OR > maxOR && OR < k) { maxOR = OR; }
            if (XOR > maxXOR && XOR < k) { maxXOR = XOR; }
        }
    }

    printf("%d\n%d\n%d", maxAND, maxOR, maxXOR);
}

推荐阅读