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

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就是原来应该为的数列,输出就好

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

报告相同问题?

悬赏问题

  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题