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