C语言比较两个无序数组是否含相同元素,运行结果错误求排查
问题排查与修复方案
首先你的排序思路是正确的,出错的核心是排序后的元素对比逻辑,存在两个明显问题:
- 对比逻辑不符合需求:你写的双重循环只要找到任意一个相同元素就会把
flag置为1,后续哪怕有其他元素不匹配也不会修改flag的值,最终就会只要有一个元素相同就提示"含有相同元素" - 冗余的双重循环:两个数组已经完成升序排序后,只需要用单循环逐位对比对应索引的元素即可,不需要嵌套循环。
修复方法
把你原来的双层循环对比部分、结果判断部分替换为如下逻辑:
// 初始默认两个数组元素完全相同 int flag = 1; for (i = 0; i < N; i++) { // 只要有一位元素不匹配,直接标记为不同并跳出循环 if (v[i] != v2[i]) { flag = 0; break; } } if (flag == 1) printf("\nThe arrays have the same numbers! "); else printf("\nThe arrays dont have the same numbers!");
另外补充一点:你的代码里没有定义常量N,运行前需要在main函数上方加一行#define N 你要的数组长度,比如数组长度是5就写#define N 5。
完整修改后代码
// 这里根据你的需求修改N的数值,示例为3 #define N 3 #include <stdio.h> int main() { int v[N]; int v2[N]; int i,j; int a; int b; int flag = 1; printf("Please enter the values of the 1st array: "); for (i = 0; i < N; i++) { scanf("%d",&v[i]); } for (i = 0; i < N; i++) { for(j=i+1; j<N; j++) { if(v[i]>v[j]) { a = v[i]; v[i] = v[j]; v[j] = a; } } } printf("\nPlease enter the values of the 2nd array: "); for (i = 0; i < N; i++) { scanf("%d", &v2[i]); } for (i = 0; i < N; i++) { for (j = i + 1; j < N; j++) { if (v2[i] > v2[j]) { b = v2[i]; v2[i] = v2[j]; v2[j] = b; } } } // 修复后的对比逻辑 for (i = 0; i < N; i++) { if (v[i] != v2[i]) { flag = 0; break; } } if (flag == 1) printf("\nThe arrays have the same numbers! "); else printf("\nThe arrays dont have the same numbers!"); return 0; }
内容的提问来源于stack exchange,提问作者Severjan Lici
相关产品推荐
相关产品推荐

