数列的解码 (TKZW)

OJ题目数列的解码

题目描述

有n个整数组成的数列(这n个整数互不相同,取值为1-n),原始数列中第一个数字是1,将1删除后把其后的两个数字放到数列的末尾,这时排在数列开头的数字是2,将2删除,取其后的两个数字放到数列的末尾,这时数列的开头是3,依次类推,直到把数列中所有的数字删除。如果剩下的数不足两个,那么就取一个数。
例如原始数列为“1 5 3 2 4”:
将1删除后,把其后的两个数字放到数列的末尾:2 4 5 3
将2删除后,把其后的两个数字放到数列的末尾:3 4 5
将3删除后,把其后的两个数字放到数列的末尾:4 5
将4删除后,把其后的两个数字放到数列的末尾:5
将5删除后,数列变为空。
你的任务是已知n,求出原始数列。比如上述数列,已知n=5,那么就要求出数列“1 5 3 2 4”。
输入与输出要求:首先输入1个整数n,n代表连续整数的个数。n的范围是1—200。输出n个整数,即原始数列。每个整数用空格分开,最后一个整数后是换行符。
程序运行效果:
Sample 1:
7↙
1 7 5 2 4 6 3
Sample 2:
20↙
1 12 8 2 15 17 3 9 13 4 19 10 5 16 14 6 11 20 7 18

代码

#include <stdio.h>
int main()
{
    int n,A[210]={0},c1,c2;
    scanf ("%d",&n);
    if(n>3)
    {
        A[0] = n - 2;
        A[1] = n - 1;
        A[2] = n;
        for (int i = 0; i < n - 3; i++)
        {
            c1 = A[i + 1];
            c2 = A[i + 2];
            for (int j = i + 2; j >=0; j--)
            {
                A[j + 3] = A[j];
            }
            A[1] = c1;
            A[2] = c2;
            A[0] = n - i - 3;

        }
        for (int m = 0; m < n; m++)
        {
            printf("%d ", A[m]);
        }
        printf("\n");
    }
    else
    {
        for(int i=1;i<=n;i++)
        {
            printf("%d ",i);
        }
    }
    return 0;
}

心得

1.关于怎么找到规律

从正向与反向来看,当然按着题目的意思(正向)来推hin简单,所以写出后再方向来写代码

2.关于怎么交换数组元素

数列:要将上一次操作完后的数列的最后两个元素移到最前面,然后接着在数列最前面加上一个数字,eg:依次加4,3,2,1
数组:移两个,加一个,需要腾出三个空位,所以每次整体将数组后移三个,记录末尾的两个数,然后赋值给空位,再加另一个数

3.再注意一下细节

n<4时,就简单输出,eg 1,2,3

dalao 讲的好细致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值