学长的随机数

 这个题目自己做的时候写出来了,但网站一直过不了,

#include<stdio.h>
int a[100];
int flag[100];
int main()
{
    int N,num;
    scanf("%d",&N);
    for(int i=0; i<N; i++)
        scanf("%d",&a[i]);
    for(int i=0; i<N-1; i++)
        for(int j=i+1; j<N; j++)
            if(a[i]>a[j])
            {
                int t=a[j];
                a[j]=a[i];
                a[i]=t;
            }
    for(int i=0; i<N-1; i++)
        for(int j=i+1; j<N; j++)
            if(a[i]==a[j])
            {
                flag[i]=1;
                num++;
                N--;

            }
    printf("%d\n",N);
    for(int k=0; k<N+num; k++)
    {
        if(!flag[k])
        {
            printf("%d ",a[k]);
        }
    }
    printf("\n");




    return 0;
}

讲一下自己的部分思路,在第一个两重循环这里我想用选择排序(可以去b站学)先对这个数组排序,第二个俩重循环是比较有没有相等的,,有的话就标记其中一个,并进行计数,同时要输出的数也要减,这里小小的模拟一下:

 写到这里,我仿佛明白自己为什么一直过不了了--标记错了,如果标记i的话要是这数组里面有多于两个的重复数字,也就只能删一个(这里解释一下两重循环的工作原理:举个例子介绍:

即每进行一个大循环自增就要进行小循环到结束,在这里就是在i=0时要经历一遍让j等于一到九,然后经历一个i=1的大循环时同时小循环里要经历过让j等于i+1即2到9,以此类推。)所以我更新一下代码:

​
#include<stdio.h>
int a[100];
int flag[100];
int main()
{
    int N,num;
    scanf("%d",&N);
    for(int i=0; i<N; i++)
        scanf("%d",&a[i]);
    for(int i=0; i<N-1; i++)
        for(int j=i+1; j<N; j++)
            if(a[i]>a[j])
            {
                int t=a[j];
                a[j]=a[i];
                a[i]=t;
            }
    for(int i=0; i<N-1; i++)
        for(int j=i+1; j<N; j++)
            if(a[i]==a[j])
            {
                flag[j]=1;
                num++;
                N--;

            }
    printf("%d\n",N);
    for(int k=0; k<N+num; k++)
    {
        if(!flag[k])
        {
            printf("%d ",a[k]);
        }
    }
    printf("\n");




    return 0;
}

​

 但我们学校的刷题网站上还是显示运行错误。但是我还是要把我的思路讲完:

在最后一个循环里面,我想在刚开始的数组数量里面把相应标记为一的筛掉,只打印标记为零的,可能有人有疑问,反正本来就只要打印八个,为什么还要把条件设为十呢?其实我刚开始也是这样想的,但是结果是错的哦! 

 这是因为我虽然把重复的标记为一,但是并没有真的把它删掉,,只是选择性输出了,并没有将其序号左移或右移,如果这时候我输出的时候把原本的序号减少了,就会有些输不出。

由于自己的代码一直过不了只能去学别人的代码了:

#include <stdio.h>

int arr[1001];
int main()
{
	int n;
	scanf("%d",&n);

	int c=0;

	int temp;

	for(int i=0;i<n;i++){
		scanf("%d",&temp);
		arr[temp]++;
	}

	for(int i=0;i<1001;i++){
		if(arr[i]==1){
			c++;
		}
		if(arr[i]>1){
			arr[i]=1;
			c++;
		}

	}
	printf("%d\n",c);//输出排序后的个数
	for(int i=0;i<1001;i++){
		if(arr[i]==1)
		printf("%d ",i);
	}
    return 0;
}

这里定义数组总是要大一点好一些,当然,大数组最好定在外面作为全局变量, 本来自己想理解一下这里arr[temp]++的:

 后来看了注释才知道完全理解错了意思,在arr[temp]++这里,应该来说是这样的原理,刚刚给arr数组所有的都赋值为零,现在把一个数放进arr作为序号,每放一个,它的值都是零,然后再自增为一,及把输入的数都标记为一,而如果有重复的就不只为一,而在下面的循环,第一个条件是对输入的值进行计数,当然对重复的就要多记一个数,在这里我又开始想了,为什么直接变成一呢,为什么不能减一,万一有很多个重复的咋办。然后问了学长后,还是我草率了,原来这里不管它是大于一还是等于一,都只计一个数。这样才真的达到了去重的目的。学长说这个代码还可以精简一下比如这样:

#include <stdio.h>
int arr[1001]= {0}; 
int main()
{
    int n;
    scanf("%d",&n);

    int count=0;

    int temp;

    for(int i=0; i<n; i++)
    {
        scanf("%d",&temp);
        arr[temp]=1;//储存元素
    }

    for(int i=0; i<1001; i++)
        if(arr[i]==1)
            count++;
    printf("%d\n",count);
    for(int i=0; i<1001; i++)
    {
        if(arr[i]==1)
            printf("%d ",i);
    }

    return 0;
}

我之前很喜欢在这个平台上复制粘贴代码,但是编译器实际却用不了,那可能是因为粘贴的时候会带有某些中文格式,这时候还是自己手动输入比较好。

最后,再小小激励一下自己:玉渊潭洋槐花盛开,像下了一场大雪,白得耀眼 有没有感觉被这种意境美到?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值