蓝桥杯 C语言 明明的随机数
题目:

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