1.有一个数组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 <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#define ARRAY_SIZE 3
int get_cnt(int *a)
{
int cnt = 0;
int i = 0;
while(cnt < ARRAY_SIZE)
{
if(a[cnt] == 0)
{
i++;
}
cnt++;
}
return i;
}
int get_next(int *array, int cur)
{
int a = 3;
int cnt=0, raw=0;
raw = cur;
while(a)
{
cur = (cur+1) % ARRAY_SIZE;
if(array[cur] == 0)
{
a--;
}
else
{
cnt++;
if(cnt > ARRAY_SIZE*3)
{
array[raw] = 1;
return raw;
}
}
}
array[cur] = 1;
return cur;
}
int main(int argc, char** argv)
{
int a[ARRAY_SIZE] = {0};
int i=ARRAY_SIZE-1, j=ARRAY_SIZE-1;
do
{
j = i;
i = get_next(a, j);
printf("i=%d, j=%d, remain=%d\n", i, j, get_cnt(a));
} while((i-j) || get_cnt(a)>=2);
printf("%s(%d):final is %d\n", __FILE__, __LINE__, i);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <malloc.h>
int size = 0;
int get_cnt(int *a)
{
int cnt = 0;
int i = 0;
while(cnt < size)
{
if(a[cnt] == 0)
{
i++;
}
cnt++;
}
return i;
}
int get_next(int *array, int cur)
{
int a = 3;
int cnt=0, raw=0;
raw = cur;
while(a)
{
cur = (cur+1) % size;
if(array[cur] == 0)
{
a--;
}
else
{
cnt++;
if(cnt > size*3)
{
array[raw] = 1;
return raw;
}
}
}
array[cur] = 1;
return cur;
}
int main(int argc, char** argv)
{
int *a;
int i=0, j=0;
scanf("%d", &size);
if(size>999)
{
size = 999;
}
i = size-1;
j = size-1;
a = (int *)calloc(size, sizeof(int));
do
{
j = i;
i = get_next(a, j);
// printf("i=%d, j=%d, remain=%d\n", i, j, get_cnt(a));
} while((i-j) || get_cnt(a)>=2);
// printf("%s(%d):final is %d\n", __FILE__, __LINE__, i);
printf("%d", i);
free(a);
return 0;
}
正确答案
#include "stdio.h"
typedef struct queue{
struct queue *next;
int val;
}QUEUE_S;
int main(void){
int n, i;
QUEUE_S q[1000], *p;
while (scanf("%d", &n) != EOF){
/* 初始化循环队列 */
for (i = 0; i < n - 1; i++){
q[i].val = i;
q[i].next = &q[i + 1];
}
q[i].val = i;
q[i].next = q;
p = q;
while (1){
if (p == p->next){
printf("%d\n", p->val);
break;
}
p->next->next = p->next->next->next; /* 删除间隔两个之后的元素 */
p = p->next->next; /* 更新指针位置 */
}
}
return 0;
}