#include<stdio.h>
int main(){
int a[9],i,j,r,t,min,c=0;
for(r=0;r<9;r++)
scanf("%d",&a[r]);
for (j=0;j<9;j++) {
min=a[j];
for(i=j;i<9;i++) {
if(a[i] < min ) {
c=i;
min=a[i];
}
}
t=a[j];
a[j]=min;
a[c]=t;
}
for(r=0;r<9;r++)
printf("%d",a[r]);
}
这是我必须按升序排列用户输入的数字的代码。 如果输入为1 2 3 2 4 1 5 6 3输出为1 1 2 2 3 3 4 5 6但我希望输出为1 2 3 4 5 6,即删除重复的条目。请帮助我。
答案 0 :(得分:1)
如果给出了数字的范围,则可以使用布尔数组来执行此操作,该数组将1
存储到元素的相应索引中。
#include <stdio.h>
#include <stdbool.h>
#define NUM_RANGE 10
int main(){
int num;
bool freq[NUM_RANGE + 1] = {0};
for(int r = 0; r < 9; r++){
scanf("%d",&num);
freq[num] = 1;
}
for (int i = 0; i < NUM_RANGE + 1; i++)
if(freq[i])
printf("%d ", i);
}
答案 1 :(得分:1)
#include<stdio.h>
int main(){
int a[] = {1, 2, 3, 2, 4, 1, 5, 6, 3};
int n = sizeof(a)/sizeof(*a);
int i, j, t;
for (j=0;j<n-1;j++){
for(i=j+1;i<n;){
if(a[i] == a[j]){
t = a[i];
a[i] = a[--n];
a[n] = t;
continue;
}
if(a[i] < a[j]){
t = a[i];
a[i] = a[j];
a[j] = t;
}
++i;
}
}
for(i=0;i<n;i++)
printf("%d ", a[i]);
return 0;
}
答案 2 :(得分:0)
所以,这是你可以遵循的程序。
您对数组进行排序(就像您已经完成的那样)。您的排序算法具有O(n ^ 2)最坏情况运行时间,其中n是数组中元素的数量。如果您关心运行时间,可以达到的最佳运行时间是O(n logn)[MergeSort]。
接下来,我们需要找到重复项并删除它们。 由于您已经订购了它们,只需循环遍历您的阵列并检查每个数字a [i]和下一个数字a [i + 1]是否不同。如果不是,删除它并通过向前移动阵列的所有其余部分填充空白区域。
所以:
for(i = 0; i < 9; i++){
if(a[i] == a[i+1]){
deletNumber(i); //deletes number at position i in the array and shifts the
//rest of the array so the empty space is filled.
}
}
void deleteNumber(int i){
int j;
for(j = i; j<8; j++){
a[j] = a[j++];
}
}