其实加个打印就知道了。
while (s!=1); 反过来想,也就是s为1的时候结束,那if(b[i]>b[i+1])这个判断必须只能满足一次。
if(b[i]>b[i+1]) 翻译过来就是 前一个大于后一个,我们知道,原来的牌组是单调递增的,如果最后洗成原来一样,前面都是小于后面的,怎么出现大于的情况呢?
注意最后一个for循环 i的取值范围,i<2n,所以最后一次的b[i+1]其实就是b[2n],而数组的下标是从0开始的,所以这里的b[2n]其实就是牌组之外的数据,也就是一开始的0,那么最后一张牌就可以大于后一个,就是我们要找的。
#include<stdio.h>
int main()
{
int n, i, j = 0, s;
scanf_s("%d", &n);
int a[100000] = { 0 }, b[100000] = { 0 };
for (i = 0; i < 2 * n; i++) //第一次赋值
{
a[i] = i + 1;
}
do
{
for (i = 0; i < n; i++)
{
b[2 * i + 1] = a[i]; b[2 * i] = a[i + n]; //洗牌
}
j++; //洗牌计数
for (i = 0, s = 0; i < 2 * n; i++)
{
a[i] = b[i]; //为下一次洗牌准备
if (i==(2*n-1)&&(a[2*n-2]== 2*n-1))s=1; //判断倒数第二个元素是否回到原位
}
} while (s!=1);
printf("%d\n", j+1); //输出洗牌次数
return 0;
}
这是我自己写的T_T
主要想知道标答的意思
请问有好哥哥好姐姐帮帮孩子吗