必威体育Betway必威体育官网
当前位置:首页 > IT技术

约瑟夫环问题(数组和list方法)

时间:2019-06-20 06:42:08来源:IT技术作者:seo实验室小编阅读:62次「手机版」
 

约瑟夫环

先介绍一下什么是约瑟夫环问题:就是N个人围成一圈,从开头(下标为0)报数,报到你设置的Number就要出局,几轮下来后剩下最后一个人输出这个人的序号!

这里只介绍两种比较浅显易懂自己编写的代码,另外还有链表和递归的方式可以自行百度。生气

ok,第一种我们用数组来写。

int main()
{
	

	int total = 0;
	cout << "total:" << endl;
	cin >> total;
	int number = 0;
	cout << "number: " << endl;
	cin >> number;

	int *arr = new int[total];
	for (int i = 1; i <= total; i++)
	{
		arr[i - 1] = i;
	}
	int n = total;
	int shout = 1;
	int i = 0;
	while (total != 1)
	{
		if (arr[i] != -1)
		{
			i++;
			shout++;
		}
		else
		{
			i++;

		}
		if (i == 10)
		{
			i = 0;
		}
		if (shout == number && arr[i] != -1)
		{
			cout << arr[i] << "出局" << endl;
			arr[i] = -1;
			i++;
			shout = 1;
			total--;
		}


	}
	for (int i = 0; i < n; i++)
	{
		if (arr[i] != -1)
		{
			cout << "最后剩下" << arr[i] << endl;
		}
	}
	system("pause");

大概解释一下:代码前边比较好理解,给数组每个元素赋值,然后开始我们的循环,因为不知道要循环多少次所以我们用while循环,条件是什么呢?是总人数 >1,嗯。然后开始报数,我用了shout这个变量来记录当前报的数,如果报的数为number并且当前这个位置的人还在,我们就要把当前的值设为-1,代表当前位置的这个人没了,进行下次遍历,如果走到了最后一个,我们就要从头开始。结束后,我们再遍历一下数组,把值没被设置为-1的那个人输出。程序结束,附上vs2017下面的结果,还是蛮简单的对吧?大笑

ok,第二种,我们采用stl标准库当中list容器来写。

#pragma warning(disable:4996)
#include <iostream>
#include <list>
#include <stdio.h>
using namespace std;



int main()
{




	int total = 0;
	int number = 0;
	cout << "total :";
	cin >> total;
	cout << "number :";
	cin >> number;
	if (number < 1 || total < 1)
	{
		cout << "input error";
	}
	list<int>* table = new list<int>();
	for (int i = 1; i <= total; ++i)
	{
		table->push_back(i);
	}
	int shout = 1;
	list<int>::iterator it;
	for (it = table->begin(); table->size() != 1; )
	{
		if (shout++ == number)
		{
			cout << *it << "出局" << endl;
			it = table->erase(it);
			shout = 1;
		}
		else
		{
			it++;
		}
		if (it == table->end())
		{
			it = table->begin();
		}
	}
	cout << "The last one is:" << *table->begin() << endl;
	system("pause");

大致意思差不多,唯一的好处是list容器的大小是可以变化的,所以我们这边的判断条件是table->size() != 1;然后我们设置了一个迭代器去访问这个容器,如果发现当前位置的值等于number,我们就用erase()这个方法来删除这个位置,注意这边的用法,因为table->erase()返回的是一个地址。然后我们需要包含<list>头文件。没啦!得意

相关阅读

运营进阶:运营达人都是如何处理问题的?

我觉得一个牛逼的运营在工作方法上是很有讲究,可以从繁杂的工作中找到源头,一层层剖析,直至找到你想要的答案。在现有环境下,我们把在

关于sublime更换主题颜色老是失败问题

引言 博主现在每天都在用sublime书写工作日志,储存为Md格式。在网上看到各种好看的theme,按照网上的更新方法去换主题的

实时显示从file输入框中打开的图片C:\fakepath问题

一、问题产生原因 1、今天维护公司项目,需要修改一个上传图片显示的问题,就是实时显示一个从file input上传的图片问题,以下是demo:<!

当面试运营者时,我会问这三个问题

不管候选人的目标岗位level有多高,细节问题才能看出功力。面试,主要考察候选人两个方面的能力。首先是业务能力,比如有多少用户运营

逆向思维:跳出常规的思维模式,从不同的角度看待问题

编者按:本文作者 James Clear 经常会基于验证过的科学研究,给出关于自我提升方面的想法和建议。他在本文中就逆向思维展开讨论,看上

分享到:

栏目导航

推荐阅读

热门阅读