【每天例题】蓝桥杯C语言 明明的随机数

蓝桥杯 C语言 明明的随机数

题目:

 

题目要求:

1.N* 个 11000 之间的随机整数(N ≤100)。

2.对于其中重复的数字,只保留一个,把其余相同的数去掉。

3.把这些数从小到大排序

思路分析:

方法一:(此方法缺点为for循环使用太多遍,不够简便)

1.可以采取for循环与数组方式,输入所取的随机整数。

2.采用双for循环与if去掉重复的数字。

3.然后再使用for循环进行排序。

4.使用if使数组里的数小于1000

5.最后再用for循环输出数组。

代码:

#include<stdio.h>
int main()
{
    int n,i,j,k,temp,a=0;
    int s[100];
    scanf("%d",&n);
    if(n<=100&&n>=0)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d",&s[i]);
        }
        for(i=0;i<n-1;i++)
        {
            for(j=i+1;j<n;j++)
            {
                if(s[i]==s[j])//判断重复,进行去重
                {
                     for(k=j;k<n-1;k++)
                     {
                        s[k]=s[k+1];
                     }
                     n--;
                     j--;
                }
            }
        }
    }
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-1-i;j++)
        {
            if(s[j]>s[j+1])
            {
                temp=s[j];
                s[j]=s[j+1];
                s[j+1]=temp;
            }
        }
     }
     if(s[n-1]<=1000)
     {
        printf("%d\n",n);
        for(i=0;i<n;i++)
        {
            printf("%d ",s[i]);
        }
    }
    else
    {
        goto end;
    }
    end:
    return 0;
}

  

  方法二:(方法二与方法一类似,但是在输入时完成了去重处理,进一步优化代码)

1.可以再输入的时候进行去重处理,当遇到重复数字时,不将该数字放入数组,如果遇到相同,将数的总数减一。

2.完成去重后进行排序。

注意:一定要记住题目的所有限制条件,随机数必须小于1000.

代码:

#include<stdio.h>
int main()
{
	int n,i,a[100]={0},temp,j,t;
	scanf("%d",&n);
    if(n<=100&&n>0)
    {
		for(i=0;i<n;i++)
		  {
		
			scanf("%d",&t);
			for(j=0;j<i;j++)    //判断是否与前面的数有相同的
		
				if(t==a[j])
				break;
				
				if(j==i)        //没有,接着赋值
					a[i]=t;
				else {          //否则,让数的总个数减一,i减一
					   i--;     n--;
									}
			   }
//完成去重 
//排序 
		for(i=0;i<n-1;i++)
		{
			for(j=0;j<n-1-i;j++)
			{
				if(a[j]>a[j+1])
				{
					temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				}
			}
		}
				//判断数字是否超出范围 
		if(a[n-1]<=1000) 
		 {
			printf("%d\n",n);
		    for(i=0;i<n;i++)
			   printf("%d ",a[i]);
		   }
		else;
				}
   else ;
   	return 0;
		}

  经过方法二,我们完成了进一步的优化,将输入与去重结合在一起,那么有没有可能将排序与输出结合在一起,然后再想办法简化判断数组里的数小于1000的步骤呢?

       这时候我们可以从小朋友排队占位置中得到灵感,我们先将数组空出1000个空位置,此时,空位置已经完成了1到1000的标号,我们将输入的数字设为t,把t号小朋友放入t号位置,这样子,数组a[t]就被霸占了,当再来一个t号小朋友时,两个人无法霸占同一个位置,所以我们在此时完成了去重步骤,且判断了数组里的数小于等于1000,当我们输出时,按照for循环,i逐渐增大,相当于小朋友比身高,矮的小朋友先出去,同理,此时数组中小的数先出去,所以,我们在输出的同时就完成了排序工作。

以上所提到的数组格式为:a[t]=t

方法三:(由上面的举例,我们得到了更为简便的方法三)

1.方法三主要是在输入的时候完成去重,在输出的时候完成排序。

ps:由此可知,以后在实现无重复数字的排序问题时也可使用此方法,即在输出时通过数组与for循环完成排序任务

代码:

#include<stdio.h>
int main()
{
	int i,j,n,count=0,temp,t;
	int a[1001]={0};//此处表明有1000个空位置,且空位置已完成1到1000的标号 
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
	 	scanf("%d",&t);
	 	if(a[t]==0)//此时限定了输入的数<1000,且完成了去重
/*因为当输入的数为t时,已经占据了a[t]的位置,当再有一个t来时,已经没有位置给他了*/ 
	 	{
		 a[t]=t;
		 count++;//计算去重后的随机数数量 
		}
	}
	printf("%d\n",count);
	for(i=0;i<1001;i++)//此时进行排序步骤,即按照从小到大输出 
	{
		if(a[i]!=0)
		{
			printf("%d ",a[i]); 
		} 
	}
	return 0;
}

  

  运行结果

 

posted @ 2023-04-01 16:06  山远尽成云  阅读(142)  评论(0)    收藏  举报