求高手帮忙解释一下下面的josephus问题程序(C++):

intmain(){inti,j,n,m,mPrime,numLeft;list<int>L;list<int>::iteratoriter;cout<<"enterN(... int main()
{
int i,j,n,m,mPrime, numLeft;
list<int> L;
list<int>::iterator iter;
cout << "enter N(# of people) & M(# of passes before elimination):";
cin >> n >> m;
numLeft = n;
mPrime = m % n;
for( i = 1; i <= n; i++ )
L.push_back(i);
iter = L.begin();
//Pass the potato
for( i = 0; i < n; i++ )
{
mPrime = mPrime % numLeft;
if( mPrime <= numLeft/2 )
for( j = 0; j< mPrime; j++ )
{
iter++;
if( iter == L.end() )
iter = L.begin();
}
else
for( j = 0; j < mPrime; j++ )
{
if( iter == L.begin() )
iter = --L.end();
else
iter--;
}
cout << *iter << " ";
iter = L.erase(iter);
if(iter == L.end() )
iter = L.begin();
}
cout << endl;
return 0;
}
为什么mPrime <= numLeft/2时正着数,mPrime > numLeft/2时倒着数,同时为什么numLeft没有变化(此处是否有问题)?
展开
 我来答
jackwind1987
2013-02-25 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:476万
展开全部
你这个numLeft就是等于你输入的n,从来没改变过值,怎么会有变化?
另外STL里有rbegin和rend就是从后往前数的,不用你自己--L.end()
更多追问追答
追问
你好,谢谢你的回答,这个程序是书上的程序,我没有看懂,那么numLeft既然没有用,是不是就可以直接删去这个变量,是不是这本书在此处有问题?另外mPrime  numLeft/2时倒着遍历是程序解决问题的算法,我不懂这里,和STL里的rbegin和rend应该没有关系吧?
追答
什么书啊……没改变过值也不等于没有用啊,不能删掉。我的意思是正着数可以用begin()和end()倒着数用rbegin()和rend(),你这个书上的代码写的很不规范。
这里正着数和倒着数是为了效率,都正着数也行的。如果是在后一半里,那倒着数肯定快啊。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式