在随机生成数组中查找是否存在与输入的数字x相同的数字,有的话(除与x相同的数字外)依次前移,该数字放在最后(考虑有多个相同数据情况),若无,输出“Not found!”

一、容易想到的好理解的方式:使用count来记录有几个与输入数字一样的个数,移动count轮

输入一个整数x,在数组a中查找x,如果x不在该数组中,则输出“Not found!”;否则把数组中所有与x相同的数据移至数组的最后端,其他数据相对位置不变,依次前移,最后输出该数组。需要考虑数组中有多个与x相同的数据的情况。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
	srand((unsigned int)time(NULL));
	int i,j,a[20],x;
	for(i=0;i<20;i++){
		a[i]=rand()%51+50;    //生成50-100的随机数
		printf("%d ",a[i]);
	}
	printf("请输入要比较的数字:"); 
	scanf("%d",&x);
	int flag=0,count=0;
	for(i=0;i<20;i++){
		if(a[i]==x){
			flag=1;
			count++;   //count记录数组中有多少个与x相同的数据
		}
	} 
	if(!flag){
		printf("Not Found!");
	}else{
		while(count>0){  //每轮依次前移,共移动count轮
			for(i=0;i<20;i++){
				if(a[i]==x){
					for(j=i;j<19;j++){
						a[j]=a[j+1];   //依次前移
					}
					a[19]=x;
				}
			}
			count--;
		}
		for(i=0;i<20;i++){
			printf("%4d",a[i]);
			if(i%10==9){     //十个一行输出
				printf("\n");
			}
		}
	}
	return 0;
}

二、在原数组的基础上记录是否当前数组元素等于输入的元素,不相等的话用k记录当前所有与k不相等的下表,最后循环结束后,从最后的k的位置一直到数组的末尾都赋值x

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
	srand((unsigned int)time(NULL));
	int i,j,a[20],x,k;
	for(i=0;i<20;i++){
		a[i]=rand()%51+50;
		printf("%d ",a[i]);
	}
	printf("请输入要比较的数字:"); 
	scanf("%d",&x);
	int flag=0;
	for(i=0;i<20;i++){
		if(a[i]==x){
			flag=1;
		}
	} 
	if(!flag){
		printf("Not Found!");
	}else{
		for(i=0,k=0;i<20;i++){
			if(a[i]!=x){
				a[k++]=a[i];
			}
		}
        //记录当前k的位置,从当前位置开始直至最后一个元素都是x
		for(;k<20;k++){
			a[k]=x;
		}
		for(i=0;i<20;i++){
			printf("%4d",a[i]);
			if(i%10==9){
				printf("\n");
			}
		}
	}
	return 0;
}

 三、关键判断i与k是否相等

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
	srand((unsigned int)time(NULL));
	int i,j,a[20],x,k;
	for(i=0;i<20;i++){
		a[i]=rand()%51+50;
		printf("%d ",a[i]);
	}
	printf("请输入要比较的数字:"); 
	scanf("%d",&x);
	for(i=0,k=0;i<20;i++){
		if(a[i]!=x){
			a[k++]=a[i];
		}
	} 
	if(k==i){
		printf("Not Found!");
	}else{
		for(;k<20;k++){
			a[k]=x;
		}
		for(i=0;i<20;i++){
			printf("%4d",a[i]);
			if(i%10==9){
				printf("\n");
			}
		}
	}
	return 0;
}

附加运行截图:(三种运行结果都一样,只是实现方法略有不同) 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值