洗牌问题,答案最后的for和while看都看不懂~~

 

其实加个打印就知道了。

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

主要想知道标答的意思

请问有好哥哥好姐姐帮帮孩子吗