编一C程序,它能读入两组整数(每组整数都以-9999为结束标记,个数都不大于1000),并以从小到大的次序输出既在第一组整数中也在第二组整数中的所有整数(同一个整数不能输出两次)。(输入时,两个相邻的整数用空格隔开)。
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 1000
#define END -9999
int n, m;
int arrayN[MAX_SIZE], arrayM[MAX_SIZE];
int res[MAX_SIZE], index;
int cmp(const void *a, const void *b)
{
return *(const int*)a - *(const int*)b;
}
void GetAns()
{
int p1, p2;
qsort(arrayN, n, sizeof(arrayN[0]), cmp);
qsort(arrayM, m, sizeof(arrayM[0]), cmp);
for (p1 = p2 = index = 0; p1 < n&&p2 < m;)
{
if (arrayN[p1] == arrayM[p2])
res[index++] = arrayN[p1], ++p1, ++p2;
else
arrayN[p1] < arrayM[p2] ? ++p1: ++p2;
}
}
int main()
{
int x, i;
printf("请输入第一组整数:");
for(n=0;scanf_s("%d",&x)&&x!=END;arrayN[n++]=x)
{ }
printf("请输入第二组整数:");
for(m=0;scanf_s("%d",&x)&&x!=END;arrayM[m++]=x)
{ }
GetAns();
printf("排序结果为:");
for (i = 0; i < index; printf("%d%c", res[i], "\n"[i + 1 == index]), ++i);
return 0;
}
无法正常排序
程序运行正确
同学,你这代码没问题啊,别迷糊啊。
看清楚题目要求哦,题目要求是:
“并以从小到大的次序输出既在第一组整数中也在第二组整数中的所有整数(同一个整数不能输出两次)”
你问题中测试的数据中本来就没有数据可以输出啊,哈哈哈,是不是突然觉得自己好傻啊
骗我读了好久代码
代码写的很漂亮,没有问题,
非要挑毛病的话
那就是最终的输出格式的问题了,不应该换行的,题目要求是数据之间隔空格就行
你的代码写的好厉害的样子,特别是for()循环语句用的,贼漂亮,学到了学到了
还有qsort()函数,用的也很巧妙,好厉害的样子,作为一个小白,很崇拜
加油加油,一起努力
如果有帮助的话,麻烦点个赞吧,谢谢奥
for (i = 0; i < index; ++i){
printf("%d%c", res[i], "\n"[i + 1 == index]);
}
最后for循环改下
不懂可继续交流,感谢采纳!
说一下思路,就不写码了。
1、假设两个整形数组(num1和num2)已经就绪,每个数组最多1000个元素。当某个元素=-9999时,表示该数组后面的元素无意义了。
2、挑出在两个数组中都有出现的数值,并放入一个新的数组num3中。可以用两个嵌套for循环实现这个目标。
k=0;
for(i=0;i<1000;i++){
if(num1[i]==-9999)break;
for(j=0;j<1000;j++){
if(num2[j]==-9999)break;
if(num1[i]==num2[j]){
num3[k]=num2[j];
k++;
}
}
}
3、将num3数组中的元素按大小排序即可。
最后的打印怎么错位了?改成这样试试
for (i = 0; i < index; ++i)
{
printf("%d%c ", res[i], i);
if ((i + 1) % 16 == 0)
printf("\n"); /* 换行显示 */
}