无聊解一道数学题:喝农药杀人(这什么题目!!??)

【原题】

N个人围成一圈,进行编号,记为1到N号。

船长说,只有一个人可以留在船上。从一号开始传一瓶毒药,每隔一个人,接到毒药的人就必须喝下它。第一圈1号3号5号会纷纷喝毒药倒下...由于大家围成一个圈,所以进行到最后,必然只有一个人可以活下来。

活下来的人是几号?


【解题过程】

反正也没看出来有什么规律,就干脆写个程序把结果打印出来看一下,程序如下:

// kill_person.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

typedef unsigned long DWORD;

typedef struct _T_Node
{
	DWORD dw_val;
	bool b_killed;
	struct _T_Node* pt_pre;
	struct _T_Node* pt_next;
}T_Node;


void Calc(DWORD dw_num)
{
	T_Node at_node[1000];
	DWORD dw_left;
	DWORD i;
	T_Node* pt_cur;

	// set default value -------
	dw_left = dw_num;

	// init -------
	for (i = 0; i < dw_num; i++)
	{
		at_node[i].b_killed = false;
		at_node[i].dw_val = i + 1;
	}

	for (i = 0; i < dw_num - 1; i++)
	{
		at_node[i].pt_next = &at_node[i + 1];
	}
	at_node[dw_num - 1].pt_next = &at_node[0];

	for (i = 1; i < dw_num; i++)
	{
		at_node[i].pt_pre = &at_node[i - 1];
	}
	at_node[0].pt_pre = &at_node[dw_num - 1];

	// calc ---------
	pt_cur = &at_node[0];
	while (dw_left > 1)
	{
		// kill
		pt_cur->b_killed = true;
		dw_left--;

		(*(pt_cur->pt_pre)).pt_next = pt_cur->pt_next;
		(*(pt_cur->pt_next)).pt_pre = pt_cur->pt_pre;

		pt_cur = pt_cur->pt_next;
		pt_cur = pt_cur->pt_next;
	}

	// show result --------
	for (i = 0; i < dw_num; i++)
	{
		if (false == at_node[i].b_killed)
		{
			printf("一共%d个人,第%d个人活了下来\r\n", dw_num, at_node[i].dw_val);
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	DWORD i;

	for (i = 2; i < 100; i++)
	{
		Calc(i);
	}

	getchar();

	return 0;
}

打印出来以后,发现结果还是有规律的,截张图:



当然后面的结果是自己根据规律总结的,不算是严格的求解:



转载于:https://www.cnblogs.com/sevenchrist/p/5982091.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值