题目如下:
有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
代码如下:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct A {
int data1;
int data2;
}A;
int main()
{
int num;
while(scanf("%d",&num)!=EOF) {
if(num > 1000) {
num = 1000;
}
num--;
A a[1000] = {0};
for(int i=0;i<num + 1;i++) {
a[i].data1 = i;
}
a[num].data2 = -2;
A *p = a;
int flag_3 = 1;
int flag_end = num + 1;
while(flag_end != 1) {
if(flag_3 == 3) {
p->data1 = -1;
flag_3 = 0;
flag_end--;
if(flag_end == 1) {
for(int i = 0;i < num + 1;i++) {
if(a[i].data1 != -1) {
printf("%d\n",a[i].data1);
break;
}
}
}
}
if(p->data2 == -2) {
p = a;
} else {
p++;
}
if(p->data1 != -1) {
flag_3++;
}
}
}
return 0;
}