解题思路:这是常规思路,类似按身高排队一样,已经排好的队,你想插进去,找到比你矮的和比你高的前后两个人,之后的人往后退一步就行了。

首先是输入只含有9个元素的数组a[10],用for循环依次输入。接着输入插入的数字x,将x与数组元素比较,当a[i]<=x<=a[i+1]时,记录x应该插入的位置t=i+1。但是插入x之前要把元素往后移位,从后往前直到位置t,最后把x赋值给a[t],输出排好的a[10]。

注意事项:注意移位从后往前,不然从前往后会使数据丢失。找插入位置时注意break退出遍历循环,不然肯定是最后面。

参考代码:

#include <stdio.h>

int main()
{
    int a[10];
	int i=0;
	int t;
	for(i=0;i<9;i++)
	{
		scanf("%d",&a[i]);
	}
	a[9]=0;
	int x;
	scanf("%d",&x);
	for (i=0;i<10;i++)
	{
		if(x>=a[i] && x<=a[i+1])
		{
			t=i+1;
			break;
		}
	}
//	printf("%d\n",t);
	for (i=9;i>t;i--)
	{
		a[i]=a[i-1];
	}
	a[t]=x;

	for (i=0;i<10;i++)
	{
		printf("%d\n",a[i]);
	}
    return 0;
}


点赞(0)
 

0.0分

101 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 66 条评论

中南打工人 3年前 回复TA
这个有问题吧,如果你由大到小的输入数字,它就会报错,例如:
66 55 54 53 52 51 49 48 46
50
我觉得这个可以参考一下1023题,如果是上述情况的话只用反向输出排好的数就行了。
小王同学 3年前 回复TA
@20计科周志春 @uq_62473712301 改成m小于等于i+1就好了,小于号乱码了。。
小不点 3年前 回复TA
@20计科周志春 m>=i+1
20计科周志春 3年前 回复TA
@20计科周志春 @wang10 m&gt  什么意思啊?请教一下。
小王同学 3年前 回复TA
@20计科周志春 for(m=9;m>=i+1;m--)
20计科周志春 3年前 回复TA
#include<stdio.h>
#include<string.h>
int main()
{
	int a[10];
	int i,m=0,t;
	for(i=0;i<9;i++)
	{scanf("%d",&a[i]);
	}
	getchar();
	scanf("%d",&a[9]);
	for(i=0;i<9;i++)
	{
		if(a[9]>a[i])
		{
			if(a[9]<a[i+1])
			{
				t=a[9];
				for(m=9;m<=i+1;m--)
					a[m]=a[m-1];
				a[i+1]=t;
			}
		}
	}
	for(i=0;i<10;i++)
		printf("%d\n",a[i]);
}
输出结果不对·,循环不知道哪出问题了,请求大佬
Joey 3年前 回复TA
#include <stdio.h>
#include <malloc.h>
int main()
{
	int len, i, add, e, j, t;
	len=9;
	int *p = (int*)malloc(sizeof(int) * len);

	for(i=0; i<len; ++i)
		scanf("%d", &p[i]);
	printf("\n");

	scanf("%d", &e);
	j=0;					//给插入的元素选位置 
	while(e>p[j])
	{
		j++;
	}	
	add=1;
	len+=add;				//数组长度改变

	p=realloc(p, (sizeof(int)*len));		//重新分配动态内存 
	t=len;
	while(t>5)				//插入点后面的元素顺序后移
	{
		p[t]=p[t-1];
		t--;
	}
	p[j]=e;					//将新插入的元素放入数组队列
	for(i=0; i<len; ++i)
		printf("%d\n", p[i]);	 
	return 0;
}
请教各位大佬,动态构造数组的方法是不是用的不对?
hero 3年前 回复TA
#include <stdio.h>
int main()
{
	int a[10];int i =0;int x;int t; 
    a[9] = 0;
	for(i=0;i<9;i++){
     scanf("%d",&a[i]);
	} scanf("%d",&x);
	for(i=0;i<9;i++){
	 if(x>a[i-1]&&x<a[i]){ t = i;break;
	 } 
	} 
	for(i=8;i>t;i--){ a[i+1]=a[i];
	} a[t] = x;
	for(i=0;i<10;i++){ printf("%d ",a[i]);
	}return 0;
 }  有没有大哥帮我看一下我这样写是哪一步出了问题
X 3年前 回复TA
#include <stdio.h>
int main(){
    int a[10];
    int i=0;
    int t;
	int x;
    for(i=0;i<9;i++){
        scanf("%d",&a[i]);
    }
    a[9]=0;
    scanf("%d",&x);
	//最前面
	if(x<=a[0]){
		for (i=9;i>0;i--){
			a[i]=a[i-1];
		}	
		a[0]=x;
	}
	//最后面
	else if(x>=a[8]){
		a[9]=x;
	}else{
	//中间
		for (i=0;i<10;i++){
			if(x>=a[i] && x<=a[i+1]){
				t=i+1;
				break;
			}
		}
		for (i=9;i>t;i--){
			a[i]=a[i-1];
		}
		a[t]=x;		
	}
	
	
    for (i=0;i<10;i++){
        printf("%d\n",a[i]);
    }
    return 0;
}
诺坎普北看台 3年前 回复TA
@诺坎普北看台 #include<stdio.h> int main(){ 	int a[10],i,x,y,j; 	for(i=0;i<9;i++){ 		scanf("%d",&x); 		a[i]=x; 	} 	scanf("%d",&y); 	a[9]=y; 	int change; 	change=a[9]; 	for(j=8;j>=0&&change<a[j];j--) 	a[j+1]=a[j]; 	a[j+1]=change; 	for(i=0;i<10;i++) 	printf("%d
",a[i]); 	return 0; }解决啦,供参考