给你2n张牌,编号为1,2,3,...,n,n+1,...,2n,这也是最初的牌的顺序。一次洗牌是把序列变为 n+1, 1, n+2, 2, n+3, 3, n+4, 4, ..., 2n, n。可以证明,对于任意正整数n,都可以在经过m次这样的洗牌后,这幅牌重新回到初始的顺序。 编程对于2n(n从键盘输入)张牌进行洗牌,求出重新得到初始顺序的洗牌次数m的值。 输入输入正整数n,即2n张牌。 输出输出洗牌次数m的值。 样例输入 50 样例输出经100次洗牌回到初始状态 用c语言
时间: 2024-02-06 18:10:46 浏览: 165
用c语言做的一个随机数洗牌,并随机发牌的程序
5星 · 资源好评率100%
以下是C语言实现,使用了循环和数组来模拟洗牌过程:
```c
#include <stdio.h>
int main() {
int n, m = 0;
scanf("%d", &n);
int cards[2*n + 1];
for (int i = 1; i <= 2*n; i++) {
cards[i] = i;
}
do {
m++;
int tmp[2*n + 1];
for (int i = 1; i <= n; i++) {
tmp[2*i - 1] = cards[i];
tmp[2*i] = cards[n + i];
}
for (int i = 1; i <= 2*n; i++) {
cards[i] = tmp[i];
}
} while (cards[1] != 1 || cards[2*n] != 2*n);
printf("经%d次洗牌回到初始状态\n", m);
return 0;
}
```
解释一下代码:
首先读入n,然后创建一个长度为2n+1的数组cards,用来存储牌的编号。接着用循环初始化cards数组,将牌的编号依次赋值。
然后进入一个do-while循环,这个循环用来模拟洗牌过程。首先将洗牌次数m加1,然后创建一个新的数组tmp,用来存储洗牌后的牌的编号。接着用for循环将牌按照洗牌规则重新排列并存入tmp数组中。最后再用for循环将tmp数组中的牌复制回cards数组中。
重要的是,每次循环结束后,需要检查cards数组是否回到了最初的顺序,如果没有,就继续循环。这里我们用了cards[1] != 1 || cards[2*n] != 2*n来判断是否回到了最初的顺序,因为最初的顺序是1, 2, 3, ..., 2n,所以cards[1]应该是1,cards[2*n]应该是2n。
最后输出洗牌次数m即可。
阅读全文