一、容易想到的好理解的方式:使用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;
}
附加运行截图:(三种运行结果都一样,只是实现方法略有不同)