C/C++嵌套循环中双数组条件判断的逻辑错误排查
问题分析
你的代码逻辑错误在于:内层循环遍历反派武器时,每次比较都会覆盖secret的值,最终secret只保留了最后一个英雄武器和最后一个反派武器的比较结果,而不是判断是否存在某个英雄武器能击败所有反派武器。
比如你给出的测试用例,英雄武器9确实比所有反派武器都大,但因为最后一个英雄武器是2,和反派最后一个武器3比较后secret被设为false,导致最终输出错误。
解决方案一:修正嵌套循环逻辑
调整判断逻辑:对每个英雄武器,先假设它能击败所有反派武器(设临时标记),如果遇到任何一个反派武器比它大,就推翻假设并跳出内层循环;如果遍历完所有反派武器都没被推翻,就说明找到符合条件的武器,直接设置secret为true并终止所有循环。
修正后的代码:
#include <stdio.h> #include <stdbool.h> int main(){ int N, M; bool secret = false; scanf("%d %d", &N, &M); int X[N]; int Y[M]; for(int i = 0; i < N; i++){ scanf("%d", &X[i]); } for(int i = 0; i < M; i++){ scanf("%d", &Y[i]); } for(int i = 0; i < N; i++){ bool canBeatAll = true; // 假设当前英雄武器能击败所有反派 for(int j = 0; j < M; j++){ if(X[i] <= Y[j]){ // 只要有一个反派武器更大,就推翻假设 canBeatAll = false; break; // 没必要继续比较当前英雄武器了 } } if(canBeatAll){ // 如果找到符合条件的武器 secret = true; break; // 没必要继续检查其他英雄武器了 } } if(secret){ printf("The dark secret was true\n"); } else{ printf("Secret debunked\n"); } return 0; }
解决方案二:先找反派武器的最大值(更高效)
先找出反派武器数组Y中的最大值,再检查英雄武器数组X中是否存在大于这个最大值的元素即可。这种方法时间复杂度更低(O(N+M) vs 原方法的O(N*M)),逻辑也更简洁。
代码实现:
#include <stdio.h> #include <stdbool.h> int main(){ int N, M; bool secret = false; scanf("%d %d", &N, &M); int X[N]; int Y[M]; for(int i = 0; i < N; i++){ scanf("%d", &X[i]); } // 找出反派武器的最大值 int maxY = -1; // 假设伤害值都是正整数,可根据实际情况调整初始值 for(int i = 0; i < M; i++){ scanf("%d", &Y[i]); if(Y[i] > maxY){ maxY = Y[i]; } } // 检查是否有英雄武器大于maxY for(int i = 0; i < N; i++){ if(X[i] > maxY){ secret = true; break; // 找到后直接退出循环 } } if(secret){ printf("The dark secret was true\n"); } else{ printf("Secret debunked\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Nelsen Cookie
相关产品推荐
相关产品推荐

