约瑟夫环问题

问题:

有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。

 

思路:

1.一个30长度的列表,循环读取,每读取9次,第9次进行标记

2.如果再次读取读到已标记的进行跳过

 

代码:

def main():
	index, count, num =0, 0, 0
	persons = [True]*30
	while count<15:
		#如果是True则 num+1。进行到后面,会遇到标记为 False的值,直接跳过,进行下一个循环。
		if persons[index]:
			num += 1
			if num == 9:
				persons[index] = False
				count += 1
				num = 0
				
		index += 1
		#对index进行取余操作,以免进行到最后index的值操作列表长度
		index %= 30

	for person in persons:
		print('基' if person else '非', end=' ')

if __name__ == '__main__':
	main()

 

你可能感兴趣的:(约瑟夫环问题)