扑克洗牌问题(小白code记录)

扑克洗牌问题

Description:

给您2n张牌,编号为1,2,3,4,5……n,n+1,……2n,这也是最初牌的顺序。一次洗牌是吧序列变为n+1,1,n+2,2,n+3,3……2n,n。可以证明,对于任意自然数n,都可以在经过m次洗牌后重新得到初始的顺序。
编程对于小于10000的自然数n(n从键盘输入)的洗牌,求出重新得到初始顺序的洗牌次数m的值,并显示洗牌过程。

Input

输入整数n

Output

显示洗牌过程,并输出洗牌次数m

Sample Input

5

Sample Output

1:6 1 7 2 8 3 9 4 10 5
2:3 6 9 1 4 7 10 2 5 8
3:7 3 10 6 2 9 5 1 8 4
4:9 7 5 3 1 10 8 6 4 2
4:10 9 8 7 6 5 4 3 2 1
6:5 10 4 9 3 8 2 7 1 6
7:8 5 2 10 7 4 1 9 6 3
8:4 8 1 5 9 2 6 10 3 7
9:2 4 6 8 10 1 3 5 7 9
10:1 2 3 4 5 6 7 8 9 10
m=10

大致想了想,没找出啥数学规律,直接用模拟法了。

#include 
using namespace std;

int main(int argc,char* argv[]){
	int n,count=0;
	bool judge ;
	cin >> n;
	int *poker = new int[2 * n];
	int *poker_prev = new int[2 * n];

	for (int i = 0; i < 2 * n; i++) {
		poker[i]=i+1;
	}
	for (;;) {
		judge = true;
		for (int i = 0; i < 2 * n; i++) {
			poker_prev[i] = poker[i];
		}
		for (int i = 0; i < n; i++) {
			poker[2*i] = poker_prev[n+i];
			poker[2 * i + 1] = poker_prev[i];
		}
		count++;
		for (int i = 0; i < 2 * n; i++) {
			cout << poker[i] << ends;
		}
		cout << endl;
		for (int i = 0; i < 2 * n; i++) {
			if (poker[i] != i + 1)
				judge = false;
		}
		
		if (judge)
			break;
	}
	cout << "m="<

新手code记录 2019.4.21

你可能感兴趣的:(Code记录)