c语言数组内元素比较大小,用C语言确定两个数组内的元素排列顺序不同,但是元素相同,代码有bug找不出?...

我觉得稍微麻烦一点的就是允许数组内有重复,我想了两个办法,一种是排序好再挨个比较。另外一个我写了出了,但是跑不正确,怎么弄k都等于10,代码如下,请看出bug的大神指点:

int thr_bg(int s1[],int s2[]){

int q,w,k=0;

for (q=0; q<10; q++) {

for (w=0; w<10 && s1[q]!=s2[w]; w++);

// 找出与数组1第一个相同元素的位置

if (w<10) {

for (; w<10; w++) {

s2[w]=s2[w+1];

}

//把数组1第一个相同元素剔除,后面的元素依次向前

k++;

//记录与数组1第一个相同元素的个数

}

}

printf("%d\n",k);

if (k=10) { //如果有十个相同元素,就代表完全相同

return 1;

}

else return 0;

}

int main(){

int s1[10],s2[10],i,j;

printf("s1:");

for (i=0; i<10; i++) {

scanf("%d",&s1[i]);

}

printf("s2:");

for (j=0; j<10; j++) {

scanf("%d",&s2[j]);

}

if (thr_bg(s1,s2))

printf("yiyang");

else printf("buyiyanga");

}

另外,还有什么其他的实现方法推荐吗?

C语言中,要比较两个数组并去掉相同元素,同时保持元素个数不变,可以通过以下步骤实现: 1. 遍历第一个数组的每个元素。 2. 对于第一个数组中的每个元素,再遍历第二个数组,检查是否存在相同元素。 3. 如果在第二个数组中找到与第一个数组相同元素,则将该元素从第二个数组中删除。这通常需要移动数组元素以覆盖要删除的元素,或者使用一个标记来表示该位置的元素已经被删除。 4. 由于元素个数不变,我们实际上不是删除元素,而是将不同元素移动到数组的前面。 下面是一个简单的示例代码,用于比较两个数组并移除第二个数组中的相同元素: ```c #include <stdio.h> void removeCommonElements(int arr1[], int arr2[], int len1, int len2) { for (int i = 0; i < len2; ++i) { for (int j = 0; j < len1; ++j) { if (arr1[j] == arr2[i]) { // 从第二个数组中移除元素,即将后面的元素前移 for (int k = i; k < len2 - 1; ++k) { arr2[k] = arr2[k + 1]; } // 将最后一个元素置为0或其他标记值,表示该位置元素已被处理 arr2[len2 - 1] = 0; // 或者可以使用其他值或者方法来标记 // 因为我们不改变数组长度,所以减小len2来模拟删除操作 len2--; i--; // 由于当前元素已经比较过,需要再次比较新移动到当前位置的元素 break; // 如果找到相同元素,则跳出内层循环 } } } } int main() { int arr1[] = {1, 2, 3, 4, 5}; int arr2[] = {3, 4, 5, 6, 7}; int len1 = sizeof(arr1) / sizeof(arr1[0]); int len2 = sizeof(arr2) / sizeof(arr2[0]); removeCommonElements(arr1, arr2, len1, len2); printf("第一个数组: "); for (int i = 0; i < len1; i++) { printf("%d ", arr1[i]); } printf("\n第二个数组: "); for (int i = 0; i < len2; i++) { if (arr2[i] != 0) { // 排除标记值 printf("%d ", arr2[i]); } } printf("\n"); return 0; } ``` 这段代码在移除第二个数组中的相同元素时,使用0来标记被移除的元素,因为数组的长度保持不变,所以我们在处理完所有相同元素后,仍然可以遍历到数组的末尾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值