c语言把十个数排列在一起,怎样使它们最大的三个数用序号表示?
你的问题是对十个数字,找出其中最大的三个数的序号(对应数组的下标和皮哪)。
方法不止一种,我的思路:
1、随机数生成10个数字组成数组num。
2、定义一个数组x,用于保存最大三个数字的下标(数字大小是从大到小)。
3、遍历num找出数组最小值的下标,将其保存到变量mi中。
4、用mi的值初始化x(也就是初始三个数都对应最小数字)。
5、再次遍历num,每次和x中对应的每一数对比,发现大于的,则当前x元素全部往后移动一位,并且将当前数值下标记录在x当前元素内。
最后得到的数组x就是题目要的序号。
PS:写程序考虑要扩展和通用,因此所有参数(数字个数,数字位数,最大数的个数)都定义成常量,只要修改常量可适应n个数排列,求最大m个数的序号。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MN 10//最大数字个数
#define N 100//单个数字不超过
#define M 3//想要统计的最大数量(题目要最大前3,可改其它值)
int main()
{
int i=0,num[MN],mi=0,x[M]={0},*p=&x[0],*p2=NULL;
srand(time(NULL));
printf("数组(随机)为:\n");
while(i<MN)
{
num[i]=rand()%N;
if(num[i]<num[mi])mi=i;//找出最小值序号
printf("%d ",num[i++]);
}
for(i=0;i<M;i++)x[i]=mi;//用最小值下标初始化x数组
printf("\n");
i=0;
while(i<MN)
{
p=&x[0];
while(1)
{
if(num[i]>num[*p])
{
p2=&x[M-1];
while(p2>p)*p2=*(p2-1),p2--;//x当前位往后依次后移
*p=i;
break;
}
else p++;
if(p>&x[M-1])
break;
}
i++;
}
printf("\n其中最大的三个数组序号分别为(序号从0开始):\n");
for(i=0;i<M;i++)
printf("数字%d,序号%d。\n",num[x[i]],x[i]);
return 0;
}