解题思路:

  1. 创建int类型的数组,将N个数据存放进去,定义cnt = N;

  2. 先给数组排序,排序之后相同的数会在相邻位置(关键),再进行相邻的判断;

  3. 若相邻的数相同,把左边的数变为-1(题目中规定数字属于[1,1000]),将-1视作“不输出”的符号,并且cnt--;

  4. 最后输出cnt,换行再将数组s中的数字“有选择地”输出(若检测为-1则不输出);


注意事项:

  1. cnt记得减少;

  2. 要先定义N才能定义数组s;

  3. 去重时要“去掉”左边的数,因为指针(或者说数组中的下标)是向右移动的,如果你从右往左移动就要去掉右边的数,否则会导致去重出错(比如有三个相同的数时)。

  4. 不要直接N--,这样会到导致循环终点移动。

  5. qsort函数在头文件<stdlib.h>中,声明为“void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))”;


参考代码:

#include <stdio.h>
#include <stdlib.h> //为了调用qsort

int upCmp(const void *a, const void *b) //qsort的比较函数,用来将整型升序排列
{
    return *(int *)a > *(int *)b ? 1 : -1;
}

int main(void)
{
    int N, cnt;
    scanf("%d", &N);
    cnt = N;
    int s[N];
    for (int i = 0; i < N; ++i) //循环N次,输入N个数据
    {
        scanf("%d", &s[i]);
    }
    qsort(s, N, sizeof(int), upCmp); //qsort(数组地址,数组元素个数,每个元素大小,排序函数)
    for (int i = 0; i < N; ++i)      //若相邻两个数相同,则将左边的变为-1
    {
        if (s[i] == s[i + 1])
        {
            s[i] = -1;
            cnt--; //个数减少1个
        }
    }
    printf("%d\n", cnt); //先输出个数
    for (int i = 0; i < N; ++i)
    {
        if (s[i] >= 0) //若数据大于1则输出(题目中说了随机数在[1,1000])
            printf("%d ", s[i]);
    }
    return 0;
}


 

0.0分

12 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

#include<stdio.h>
#define N 100
void main()
{
	int n,a[N]={};
	scanf("%d",&n);
	int i,j,k;
	int term;
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	//去重复
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if( a[i]==a[j] )
			{
				for(k=j;k<n-1;k++)
					a[k]=a[k+1];
				n--;
			}
		}
	}
	//冒泡法排序
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-1-i;j++)
		{
			if(a[j]>a[j+1])
			{
				term=a[j];
				a[j]=a[j+1];
				a[j+1]=term;
			}
		}
	}
	printf("%d\n",n);
	for(k=0;k<n;k++)
		printf("%d ",a[k]);
	printf("\n");
}
2024-01-05 20:21:49
为什么相同的元素一定相邻?
2023-12-12 13:58:41
这个函数厉害
2023-03-12 11:47:48
  • «
  • 1
  • »