赞
踩
数组 a[10]={1,2,4,6,4,8,6,2,6,7}
删除数字 :6
输出结果:1 2 4 4 8 2 7
想要实现这个功能,其基本思想其实很简单:检索数组,如果遇到与输入值相同的元素,则删除该元素。至于删除数组中的元素,就只需要把数组从中断处挨个往前移一位就好了。
但数组中要是出现多个相同的数字,就需要我们进行进一步的考虑了,元素的下标问题。
思路如下:
首先使用for循环对数组进行遍历,当遇到数组元素与需要删除的数字相同时,从该处起,将下标+1.假设我们输入的数字为:6,用for循环的变量i来遍历数组,则情况如下:
输入:x 为 6
下标 0 1 2 3 4 5 6 7 8 9
元素 1 2 4 6 4 8 6 2 6 7
当i = 3 时,x = a[i] = 6,则数组a[10]从下标3开始,依次+1直到a[8](数组中第九个元素),即:
下标 0 1 2 3 4 5 6 7 8 | 9 i = 3
元素 1 2 4 4 8 6 2 6 7 | 7
可以看见数组中第一个6已经消失了,因为数组最高下标就是a[9],所以a[9] 不能再+1,因此我们的+1操作最多只加到a[8].
因为 a[9] 的值已经赋给了 a[8],所以a[9] 已经可以舍去(否则就会重复),所以目前数组中有效部分是a[0]-a[8]九个元素。
当i = 5 时,x = a[i] = 6,则数组a[10]从下标5开始,依次+1直到a[7](数组中第八个元素),即:
下标 0 1 2 3 4 5 6 7 | 8 9 i = 5
元素 1 2 4 4 8 2 6 7 | 7 7
数组中第二个6也消失了,数组的有效部分为a[0]-a[7]八个元素。
当i = 6 时,x = a[i] = 6,则数组a[10]从下标6开始,依次+1直到a[6](数组中第七个元素),即:
下标 0 1 2 3 4 5 6 | 7 8 9 i = 6
元素 1 2 4 4 8 2 7 | 7 7 7
至此,数组中的所有的6都已经被删除了,留下了从 a[0]到a[6] 七个有效元素。
因此我们打印时只需要打印前面7位就可以了,不难看见,减去的这几位正好是 “6” 出现的次数,因此我们只需要再设置一个标记,每次要求删除的数字出现时就自+1,最后输出时用数组长度减去这个标记数字,就能把有效的元素全部输出了。
#include<stdio.h> #include<string.h> int main() { int n,sum=0; //设置标记统计被删除数字的出现次数 int a[10]={1,2,4,6,4,8,6,2,6,7}; printf("\nthe array is:"); for(int i=0;i<10;i++) { printf("%d",a[i]); //遍历数组 } printf("\nplease insert a number:"); scanf("%d",&n); for(int i= 0;i<10;i++) { if(n==a[i]) { ++sum; //如出现,则下标自加1 for(int j=i;j<10-sum;j++) //仅对有效部分元素进行自加 { a[j]=a[j+1]; } } } printf("the answer is :\n"); for(int i=0;i<10-sum;i++) //仅输出有效部分 { printf("%d",a[i]); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。