基础题,对于某张牌的位置pos,若 pos<=n,一次洗牌后其位置变为 2*pos;若 pos>n,一次洗牌后其位置变为 (pos-n)*2-1。
所以只需要考虑第 1 张牌的位置,计算其经过多少次洗牌又回到原位即可。
#include <iostream>
using namespace std;
int main()
{
int N;
int pos; //第1张牌的位置
int total; //洗牌次数
while (cin >> N)
{
pos = 2; //第一次洗牌,第一张牌的位置一定变为2
total = 1;
while (pos != 1) //第一张牌没有回到原位
{
++total;
if (pos <= N)
pos *= 2;
else
pos = (pos - N) * 2 - 1;
}
cout << total << endl;
}
return 0;
}
继续加油。