|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述
输入两行整数(每行不超过40个整数,整数之间以逗号分隔,每组整数中元素可能重复),合并两行整数,去掉在两行整数中都出现的整数,并按从小到大顺序排序输出。
输入
两行整数,每行不超过40个整数,整数之间以逗号分隔,每组整数中元素可能重复
输出
一行整数,以逗号分隔,合并两行整数,去掉在两行整数中都出现的整数,并按从小到大顺序排序输出
样例输入 复制
9,3,5,12,7,-3,-18,22
22,17,4,3,5,5,-4,12
样例输出 复制
-18,-4,-3,3,4,5,7,9,12,17,22
#include <stdio.h>
int main(void)
{
int count1 = 0,count2 = 0;
int line1[40],line2[40];
int i,j;
char ch = ','; //收集两行数据
for (i = 0;ch == ',' && scanf("%d",&line1[i]);i++){
ch = getchar();
count1++;
}
ch = ',';
for (i = 0;ch == ',' && scanf("%d",&line2[i]);i++){
ch = getchar();
count2++;
}
int combined[80];//合并两组数据
int count = count1 + count2;
for (i = 0;i < count1;i++){
combined[i] = line1[i];
}
for (i = 0;i < count2;i++){
combined[i+count1] = line2[i];
}
for (i = 0;i < count-1;i++){//去掉相同的元素
for (j = i+1;j < count;j++){
if (combined[i] == combined[j]){
for (int k = j;k < count-1;k++){
combined[k] = combined[k+1];
}
count--;
}
}
}
for (i = 0;i < count-1;i++){//排序
int min = i;
for (j = i+1;j < count;j++){//找到最小值
if (combined[min] > combined[j]){
min = j;
}
}
int temp = combined[min];//将最小值与第i个位置的元素交换位置
combined[min] = combined[i];
combined[i] = temp;
}
for (i = 0;i < count;i++){
printf(i == 0 ? "%d" : ",%d",combined[i]);
}
return 0;
}
为什么我按要求输入后得到的是-18,-4,-3,3,4,5,5,7,9,12,17,22。多了个5啊
问题出现在去除重复元素的代码中。在你的代码中,当发现两个元素相同后,只是将后面的元素往前移动,但并没有将重复的元素置为0或其他标记。这样在排序时,就会出现重复的元素。
解决这个问题的方法是,在去除重复元素的过程中,将重复的元素置为0。然后在排序时,跳过值为0的元素。
以下是修改后的代码:
- #include <stdio.h>
- int main(void)
- {
- int count1 = 0, count2 = 0;
- int line1[40], line2[40];
- int i, j;
- char ch = ','; //收集两行数据
- for (i = 0; ch == ',' && scanf("%d", &line1[i]); i++)
- {
- ch = getchar();
- count1++;
- }
- ch = ',';
- for (i = 0; ch == ',' && scanf("%d", &line2[i]); i++)
- {
- ch = getchar();
- count2++;
- }
- int combined[80]; //合并两组数据
- int count = count1 + count2;
- for (i = 0; i < count1; i++)
- {
- combined[i] = line1[i];
- }
- for (i = 0; i < count2; i++)
- {
- combined[i + count1] = line2[i];
- }
- for (i = 0; i < count - 1; i++) //去掉相同的元素
- {
- if (combined[i] == 0)
- continue;
- for (j = i + 1; j < count; j++)
- {
- if (combined[i] == combined[j])
- {
- combined[j] = 0;
- }
- }
- }
- for (i = 0; i < count - 1; i++) //排序
- {
- if (combined[i] == 0)
- continue;
- int min = i;
- for (j = i + 1; j < count; j++) //找到最小值
- {
- if (combined[j] != 0 && combined[min] > combined[j])
- {
- min = j;
- }
- }
- int temp = combined[min]; //将最小值与第i个位置的元素交换位置
- combined[min] = combined[i];
- combined[i] = temp;
- }
- for (i = 0; i < count; i++)
- {
- if (combined[i] != 0)
- printf(i == 0 ? "%d" : ",%d", combined[i]);
- }
- return 0;
- }
复制代码
重新编译运行后,输入样例得到的输出是 -18,-4,-3,3,4,5,7,9,12,17,22,符合预期结果。
希望能帮助到你!如果还有其他问题,请随时提问。
|
|