rich22851716 2021-06-24 15:52 采纳率: 94.1%
浏览 36
已采纳

c++:数串的排列。

描述
前N个自然数排成一串:x1,x2,x3…Xn。先取出x1,将x2,x3移到数串尾,
再取出x4,将x5,x6移到数串尾,...类推直至取完,取出的序列恰好是:1,2,3...... N。要求输入N,求原来数串的排列方式。
输入格式 
只有一个数为N(N≤100)。
输出格式 
只有一行,为原来数串的排列方式。
样例输入 
5
样例输出 
1 5 3 2 4

  • 写回答

1条回答 默认 最新

  • chenfycc 2021-06-24 17:16
    关注
    int n,p=0,q,a[305]={},b[105]={};
    cin>>n;
    q=n;
    for(int i=1;i<=n;i++)
    {
        a[i]=i;
    }
    for(int i=1;i<=n;i++)
    {
        b[i]=a[++p];
        a[++q]=a[++p];
        a[++q]=a[++p];
    }
    for(int i=1;i<=n;i++)
    {
        a[b[i]]=i;
    }
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" ";
    }

    解释一下

    我这个思路清奇(主要因为开始没看清题)(反向推理一波)

    首先模拟一遍,假设原序列为{1,2,3,...}

    p标记队头的位置,q标记队尾的位置

    b为输出序列

    若输出应该是b_real{1,2,3,...},则b中的第n个元素k应该为n

    那么a中的第k个元素(原本是k)应该改成n

    操作完的a就是原来应该为的数列,输出就好

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?