蓝桥杯 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; }
运行结果