有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>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
int number[n+1];
for(int i=1;i<=n;i++)
{
number[i]=i;
}
int cnt=0;
int exc1,exc2;
for(int k=0;k<n-2;)
{
cnt=0;
exc1=number[n];
exc2=number[n-1];
for(int j=n-2;n-2-cnt>n-2-k;j--)
{
number[n-cnt]=number[n-2-cnt];
cnt++;
}
k++;
number[n-cnt]=exc1;
number[n-cnt-1]=exc2;
}
for(int i=1;i<=n;i++)
{
printf("%d ",number[i]);
}
return 0;
}
思路为将过程在纸上完全表示出来
1 2 3 4 5 6 7
1 2 3 4 6 7 5
1 2 3 7 5 4 6
1 2 4 6 3 7 5
1 7 5 2 4 6 3 的过程,即为将最后两个数向前几位插入