原博客地址:http://blog.chinaunix.net/uid-22566367-id-382018.html,谢谢博主!
感觉博主写的有点繁琐,特别是寻找两个不为0的值的时候。
解题的思路是:在数组中先找到两个不为0的数,第三个数就是需要删除的,赋值为0表示删除掉,再寻找下个不为0的删除,
#include <stdio.h>
#include <stdlib.h>#define MAXSIZE 1000
/*
问题描述:有一个整型数组a,共有1000个元素,即int a[1000]={1, 2, 3, 4...1000},
现在请设计一个算法,将每隔两个的数组元素删除,求最后的剩余一个元素的下标和值。
如果到结尾的话,从头开始,循环删除。
例如有十个数据时:
a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
删除的顺序是3, 6, 9, 2, 7, 1, 8, 5, 10
剩余的一个元素是4,它的下标是3.
*/
void del_print();
void del_print(int * a,int size)
{
int i=0,j=0,count=0,x=0,k;
for(j=0;j<size;j++)
{
while(a[i % size]==0) i++;
while(a[i % size]!=0)
{
i++;
while(a[i % size]==0) i++;
if((++x)==2) break;
}
printf("a[%d]=%d \n",i % size,a[i % size]);
if(i>=size) i%=size;
if(j==size-1) break;
a[i++] = 0;
x=0;
/*
printf(" 当前的数组:\n");
for(k=0;k<size;k++){
printf("%3d",a[k]);
}
printf("\n");
*/
}
printf("最后一个a[%d]=%d\n",i,a[i]);
}
int main()
{
int i=0,a[MAXSIZE];
for(;i<MAXSIZE;i++)
{
a[i] = i+1;
}
del_print(a,MAXSIZE);
printf("Hello world!\n");
return 0;
}