排查HackerRank中C语言Bitwise Operators题的代码错误
HackerRank Bitwise Operators 挑战代码错误排查
这是HackerRank平台的Bitwise Operators in C编程挑战任务:给定整数n和阈值k,需找出1到n中所有满足i<j的数对,计算其按位与(&)、按位或(|)、按位异或(^)的结果,保留所有小于k的结果中的最大值,最终按AND、OR、XOR的顺序输出。
我的代码:
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> void calculate_the_maximum(int n, int k) { int m1=0,m2=0,m3=0; for (int x=1; x<n; x++){ for (int y=2; y<=n; y++){ //and int a=x&y; if((a>m1) && (a<k)){ m1=a; }; //or int b=x|y; if((b>m2) && (b<k)){ m2=b; }; //xor int c=x^y; if((c>m3) && (c<k)){ m3=c; }; } } printf("%d\n",m1); printf("%d\n",m2); printf("%d\n",m3); } int main() { int n, k; scanf("%d %d", &n, &k); calculate_the_maximum(n, k); return 0; }
测试情况:
输入为5 4时,我的输出:
3 3 3
预期输出:
2 3 3
错误原因:
你的内层循环for (int y=2; y<=n; y++)违反了题目要求的i<j(即x<y)的数对条件:
- 当
x >= y时(比如x=3,y=2;x=2,y=2),这类数对本不该被纳入计算,但你的代码却遍历了它们。 - 以输入
5 4为例,错误的循环会计算x=3和y=3的按位与结果为3,这个值小于k=4,因此错误地将m1更新为3,但实际上(3,3)并不满足i<j的要求。
修正方案:
将内层循环的起始值改为x+1,确保只遍历x<y的合法数对:
for (int y = x + 1; y <= n; y++)
修改后,重新运行输入5 4,就能得到符合预期的输出:2、3、3。
内容的提问来源于stack exchange,提问作者Sandeepa_Dilshan_Alagiyawanna
相关产品推荐
相关产品推荐

