C语言编程 求两组整数的异或集
【问题描述】从标准输入中输入两组整数(每行不超过20个整数,每组整数中元素不重复),合并两组整数,去掉在两组整数中都出现的整数,并按从大到小顺序排序输出(即两组整数集“异...
【问题描述】
从标准输入中输入两组整数(每行不超过20个整数,每组整数中元素不重复),合并两组整数,去掉在两组整数中都出现的整数,并按从大到小顺序排序输出(即两组整数集“异或”)。
【输入形式】
首先输入第一组整数,以一个空格分隔各个整数;然后在新的一行上输入第二组整数,以一个空格分隔,行末有回车换行。
【输出形式】
按从大到小顺序排序输出合并后的整数集(去掉在两组整数中都出现的整数,以一个空格分隔各个整数)。
【样例输入】
5 1 4 32 8 7 9 -6
5 2 87 10 1
【样例输出】
87 32 10 9 8 7 4 2 -6
【样例说明】
第一组整数为5 1 4 32 8 7 9 -6,第二组整数分别为5 2 87 10
1。将第一组和第二组整数合并(去掉在两组整数中都出现的整数5和1),并从大到小顺序排序后结果为87 32 10 9 8 7 4
2 -6。
我写的程序:
#include <stdio.h>
int paixu(int s[]);
int shanshu(int x[]);
int main()
{
int a[50] = {0};
int i = 0,j = 0,k = 0;
char c;
do
{
scanf("%d",&a[i]);
c = getchar();
i++;
}
while( c != '\n');
do
{
scanf("%d",&a[i]);
c = getchar();
i++;
}
while( c != '\n');
paixu(a);
shanshu(a);
while(a[k+2] != 0 || a[k+3] != 0)
{
printf("%d ",a[k]);
k++;
}
return 0;
}
int shanshu(int x[])
{
int i = 0,j = 0;
for(i = 0;i < 50;i++)
{
if(x[i] == x[i + 1])
{
for(j = i;j < 50;j++)
x[j] = x[j + 1];
}
}
return x;
}
int paixu(int s[])
{
int i,j,index,max;
for(i = 0;i < 50;i++)
{
max = s[i],index = i;
for(j = i + 1;j < 50;j++)
{
if(s[j] > max)
max = s[j],index = j;
}
if(index != i)
s[index] = s[i],s[i] = max;
}
return s;
}
感觉有好多问题……求大神解答,解释详细点谢谢! 展开
从标准输入中输入两组整数(每行不超过20个整数,每组整数中元素不重复),合并两组整数,去掉在两组整数中都出现的整数,并按从大到小顺序排序输出(即两组整数集“异或”)。
【输入形式】
首先输入第一组整数,以一个空格分隔各个整数;然后在新的一行上输入第二组整数,以一个空格分隔,行末有回车换行。
【输出形式】
按从大到小顺序排序输出合并后的整数集(去掉在两组整数中都出现的整数,以一个空格分隔各个整数)。
【样例输入】
5 1 4 32 8 7 9 -6
5 2 87 10 1
【样例输出】
87 32 10 9 8 7 4 2 -6
【样例说明】
第一组整数为5 1 4 32 8 7 9 -6,第二组整数分别为5 2 87 10
1。将第一组和第二组整数合并(去掉在两组整数中都出现的整数5和1),并从大到小顺序排序后结果为87 32 10 9 8 7 4
2 -6。
我写的程序:
#include <stdio.h>
int paixu(int s[]);
int shanshu(int x[]);
int main()
{
int a[50] = {0};
int i = 0,j = 0,k = 0;
char c;
do
{
scanf("%d",&a[i]);
c = getchar();
i++;
}
while( c != '\n');
do
{
scanf("%d",&a[i]);
c = getchar();
i++;
}
while( c != '\n');
paixu(a);
shanshu(a);
while(a[k+2] != 0 || a[k+3] != 0)
{
printf("%d ",a[k]);
k++;
}
return 0;
}
int shanshu(int x[])
{
int i = 0,j = 0;
for(i = 0;i < 50;i++)
{
if(x[i] == x[i + 1])
{
for(j = i;j < 50;j++)
x[j] = x[j + 1];
}
}
return x;
}
int paixu(int s[])
{
int i,j,index,max;
for(i = 0;i < 50;i++)
{
max = s[i],index = i;
for(j = i + 1;j < 50;j++)
{
if(s[j] > max)
max = s[j],index = j;
}
if(index != i)
s[index] = s[i],s[i] = max;
}
return s;
}
感觉有好多问题……求大神解答,解释详细点谢谢! 展开
1个回答
展开全部
先看paixu函数……其实你知道a数组有多长,应该把这个长度当做输入传给paixu函数,让它只对这些数字排序。否则后面的0也都参与了排序,肯定会出错。
shanshu函数……好像问题不大……但是还是应该只对数组范围内的进行操作。
其实这种数组删数的操作太复杂,应该尽量避免,而且不要题让你干嘛你就干嘛,太耿直……
比如这里,排完序之后,我们不用删除数字。因为我们知道数组里一共有i个数,可以这么写:
for (k=0; k<i; )
{
if (k == i-1 || a[k] != a[k+1])
{
printf("%d ", a[k]);
k++;
}
else
k+=2;
}
直接就搞定了……
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询