位运算比较问题:代码始终输出0,请求排查解决
问题:C语言calculate_the_maximum函数始终输出0的排查与修复
问题背景
我写的calculate_the_maximum函数始终输出0,原本以为是比较逻辑有问题,但调整后还是一样。题目要求如下:
函数说明
完成calculate_the_maximum函数,要求分别输出and、or、xor运算的最大有效值(运算结果必须小于k才会被纳入考量)。
参数说明
int n:需考虑的最大整数int k:运算结果必须小于此值才会被纳入考量
输出要求
分别单独输出and、or、xor运算的最大有效值。
我的代码
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> //Complete the following function. void calculate_the_maximum(int n, int k) { //Write your code here. int AND=0,OR=0,XOR=0; for(int x=1; x<=n ; x++) { for(int y = x; y<=n; y++) { if((x&y)>AND) AND = x&y; if((x|y)>OR) OR = x|y; if((x^y)>XOR) XOR = x^y; } } if(XOR>k || XOR<2 || XOR>n){XOR = 0;} if(OR>k || OR<2 || OR>n) OR = 0; if(AND>k || AND<2 || AND>n) AND = 0; printf("%d\n%d\n%d",AND,OR,XOR); } int main() { int n, k; scanf("%d %d", &n, &k); calculate_the_maximum(n, k); return 0; }
错误原因
核心问题出在筛选有效值的逻辑完全错误:
- 题目要求运算结果小于k才纳入考量,但你先计算了全局最大值,再用一堆题目没要求的条件(比如
XOR<2、XOR>n)把结果清零,直接导致合法结果被误删。 - 遍历阶段没有判断结果是否符合
小于k的要求,而是先找全局最大值再判断,一旦全局最大值≥k就直接清零,而不是去寻找小于k的最大值。
修正后的代码
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> void calculate_the_maximum(int n, int k) { int max_and = 0, max_or = 0, max_xor = 0; // 从x+1开始遍历y,避免重复计算(x和y交换,and/or/xor结果不变) for (int x = 1; x <= n; x++) { for (int y = x + 1; y <= n; y++) { int current_and = x & y; int current_or = x | y; int current_xor = x ^ y; // 只保留小于k的结果,同时更新对应运算的最大值 if (current_and < k && current_and > max_and) { max_and = current_and; } if (current_or < k && current_or > max_or) { max_or = current_or; } if (current_xor < k && current_xor > max_xor) { max_xor = current_xor; } } } printf("%d\n%d\n%d", max_and, max_or, max_xor); } int main() { int n, k; scanf("%d %d", &n, &k); calculate_the_maximum(n, k); return 0; }
修正说明
- 优化遍历逻辑:y从
x+1开始,减少重复计算,提升效率。 - 调整有效值判断时机:计算每个运算结果后立即判断是否小于k,同时比当前最大值大才更新,确保最终得到的是符合要求的最大值。
- 移除错误限制:删掉了
XOR<2等题目未要求的条件,只保留结果 < k的核心判断。 - 变量命名更清晰:将原变量名改为
max_and、max_or、max_xor,可读性更强。
内容的提问来源于stack exchange,提问作者Ibrahim N
相关产品推荐
相关产品推荐

