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

题目要求:
1.N* 个 1 到 1000 之间的随机整数(N ≤100)。
2.对于其中重复的数字,只保留一个,把其余相同的数去掉。
3.把这些数从
思路分析:
方法一:(此方法缺点为for循环使用太多遍,不够简便)
1.可以采取for循环与数组方式,输入所取的随机整数。
2.采用双for循环与if去掉重复的数字。
3.然后再使用for循环进行排序。
4.使用if使数组里的数小于1000
#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;
}
运行结果


浙公网安备 33010602011771号