用刚学的stl写约瑟夫环

刚刚学了c++的STL,用vector对元素删除的遍历,写约瑟夫环的实现过程

先把题目和代码贴出来,然后我们慢慢分析

题目描述

Descriptionn 个小孩围坐成一圈,并按顺时针编号为1,2,…,n,从编号为 p 的小孩顺时针依次报数,由1报到m ,当报到 m 时,该小孩从圈中出去,然后下一个再从1报数,当报到 m 时再出去。如此反复,直至所有的小孩都从圈中出去。请按出去的先后顺序输出小孩的编号。
Input每行是用空格分开的三个整数,第一个是n,第二个是p,第三个是m (0 < m,n < 300)。最后一行是:

0 0 0
Output按出圈的顺序输出编号,编号之间以逗号间隔

Sample Input
8 3 4
0 0 0
Sample Output
6,2,7,4,3,5,1,8
错误的代码(待深入研究错误原因)

#include<vector>
#include<iostream>
using namespace std;
int main() {

 int I = 1;//信标
 vector<int>v;
 int n, m;
 cin >> n >> m;
 for (int i = 0; i <= n; i++) {
  v.push_back(i);//把环做出来,0是为了占用一个空间,以便于size运算不加一
 }
 cout << "被删除的元素是: " << v[I] << endl;//调试
  v.erase(v.begin() + I);
 }
 cout << "The last one is " << v[1] << endl;
 return 0;

AC代码如下

#include<vector>
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	int I ;//信标
	vector<int>v;
	int n, m;
	while (cin >> n >> I >> m) {
		if (n == m && m == I && m == 0)
			break;
		for (int i = 0; i <= n; i++) {
			v.push_back(i);//用0堵住0号元素
		}
		int N = n;
		while (N--) {//删除n个元素
			int i;
			int temp = v.size() - 1;//时刻在变
			//cout << "temp:" << temp << endl;
			I %= temp;//完善一下,保证I的取值是【1,temp】
			if (!I)
				I = temp;
			for (i = 0; i < (m - 1); i++) {//如果起点不是1,这里还是需要完善
				I++;
				if (I > temp) {
					I -= temp;
				}
			}
			/*cout << "当前的I值为" << I << endl;
			cout << "当前size为" << v.size() << endl;
			cout << "被删除的元素是: " << v[I] << endl;*/
			if (v.size() - 1 == n)
				cout << v[I];
			else
				cout << "," << v[I];
			v.erase(v.begin() + I);
		}
		cout << endl;
		v.clear();
	}
	return 0;

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值