[每周例题]蓝桥杯C语言 明明的随机数

发布时间 2023-04-01 16:30:25作者: hcr之

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

题目:

 

题目要求:

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

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

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

思路分析:

方法一:

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

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

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

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

代码:

#include<stdio.h>
int main()
{
	int n,i,j,k,temp,a=0;
	int s[100];
	printf("先输入一共取了多少数字,再将取的数字输入:\n");
	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("经过降重和排序后的结果:\n");
	 	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;
		}

  方法三:

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

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

代码:

#include<stdio.h>
int main()
{
	int i,j,n,count=0,temp,t;
	int a[1001]={0};//此处表明有1000个空位置,且空位置已完成1到1000的标号 
	printf("请输入随机数的数量:\n");
	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;
}

  运行结果