(C語言) 有n個人圍成一圈,順序排號,從第一個開始報數(從1到3報數),凡報到3的人退出圈子,問最後最後留下的是原來第幾號的那位

有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行代碼吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章