有n個人圍成一圈,順序排號,從第一個開始報數(從1到3報數),凡報到3的人退出圈子,問最後最後留下的是原來第幾號的哪位。
其實有很多的算法來解決這樣的問題,這邊我採用的是數據結構中的隊列來解決這個問題。
具體思路是:每隔兩個(counts++ % 3 == 0 )就彈出隊列,前幾個(count++ % 3 != 0)彈出隊列後在push到隊列的尾部。這樣當隊列的元素數量剩最後一個時候,就是所求的元素。
int main(void) {
Queue * queue = NULL;
queue = init();
int i = 0;
for(i = 1;i<=99;i++)
{
push(queue,i);
}
//解題思路
i = 1;
while(queue->size != 1)
{
int data = pop(queue);
if(i++ % 3 != 0)
{
push(queue,data);
}
else
{
printf("killed id is:%d\n",data);
}
}
//所求的元素是:
printf("last person id is :%d\n",pop(queue));
return EXIT_SUCCESS;
}
隊列頭文件的設計:
#ifndef QUEUE_H_
#define QUEUE_H_
#define LEN 100
typedef struct Node
{
int data;
struct Node * next;
struct Node * prev;
}Node;
typedef struct Queue
{
int size;
Node * head;
Node * tail;
}Queue;
Queue * init();
void push(Queue * queue,int data);
int pop(Queue * queue);
void travel(Queue * quque);
#endif /* QUEUE_H_ */
隊列頭文件的實現:
#include "Queue.h"
#include <stdio.h>
#include <stdlib.h>
Queue * init()
{
Queue * queue = (Queue*)malloc(sizeof(Queue));
if(queue == NULL)
{
perror("malloc error");
exit(-1);
}
memset(queue,0,sizeof(Queue));
queue->size = 0;
queue->head = NULL;
queue->tail = NULL;
return queue;
}
void push(Queue * queue,int data)
{
if(queue->size == LEN)
{
perror("over flow");
exit(-1);
}
Node * node = malloc(sizeof(Node));
if(node == NULL)
{
perror("malloc error");
exit(-1);
}
node->data = data;
node->next = 0;
node->prev = 0;
//-------------
if(queue->size == 0)
{
queue->head = node;
}
else
{
queue->tail->next = node;
node->prev = queue->tail;
}
queue->tail = node;
queue->size++;
}
int pop(Queue * queue)
{
if(queue->size == 0)
{
printf("empty!");
exit(-1);
}
Node * node = queue->head;
int data = node->data;
queue->head = node->next;
free(node);
queue->size--;
return data;
}
void travel(Queue * queue)
{
printf("----------\n");
Node * node = queue->head;
while(node)
{
printf("%d\t",node->data);
node = node->next;
}
printf("----------\n");
}
總結:在C語言裏沒有C++中的STL,這些數據結構需要自己實現。所以相對麻煩一點,在C++裏面也就10行代碼吧。