描述
对于一个已经存在的数组,指定一个位置。把数组分成两段,交换这两段数组元素。如有一个数组为:
1 2 3 4 5
现在指定为位置为3。则把数组分为[0,3)和[3,5)两段。交换后的结果为:
4 5 1 2 3
输入
第一行是n,表示有n个整型数。 (1<=n<=20)
第二行是n个整数, 数的绝对值不超过100。中间用空格分开。
第三行有一个数p1。(0<=p1<=n) 表示第一次交换的位置
第四行有一个数p2。(0<=p2<=n) 表示第二次交换的位置
第五行有一个数p3。(0<=p3<=n) 表示第三次交换的位置
输出
每次交换后,都输出一次数组元素,独占一行,数据之间用一个空格分开。详细见样例。
样例输入
5
1 2 3 4 5
3
2
1
样例输出
4 5 1 2 3
1 2 3 4 5
2 3 4 5 1
省空间的小提示:如果逆序那题你真的在数组内变换了,那么做三遍。
1 2 3 4 5 现在位置3.
第一步:把[0,3)逆序 3 2 1 4 5
第二步:把[3,5)逆序:3 2 1 5 4
第三步:把数组逆序:4 5 1 2 3
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int n,i,j,m,t,r,z,a[20],x[20],y[20],c=0,d,e=0,f;
scanf("%d\n",&n);
for(i=0;i<n;i++)
scanf("%d ",&a[i]);
scanf("%d\n%d\n%d\n",&m,&t,&r);
for(i=0,j=m-1;i<j;i++,j--)
{
z=a[i];
a[i]=a[j];
a[j]=z;
}//第一步交换
for(i=m,j=n-1;i<j;i++,j--)
{
z=a[i];
a[i]=a[j];
a[j]=z;
}//第二步交换
for(i=n-1;i>=0;i--)
{
printf("%d ",a[i]);/逆序
x[c]=a[i];c++;
}
printf("\n");//第一行
for(i=0,j=t-1;i<j;i++,j--)
{
d=x[i];
x[i]=x[j];
x[j]=d;
}
for(i=t,j=n-1;i<j;i++,j--)
{
d=x[i];
x[i]=x[j];
x[j]=d;
}
for(i=n-1;i>=0;i--)
{
printf("%d ",x[i]);
y[e]=x[i];e++;
}
printf("\n");
for(i=0,j=r-1;i<j;i++,j--)
{
f=y[i];
y[i]=y[j];
y[j]=f;
}
for(i=r,j=n-1;i<j;i++,j--)
{
f=y[i];
y[i]=y[j];
y[j]=f;
}
for(i=n-1;i>=0;i--)
printf("%d ",y[i]);
return 0;
}
另一种:
#include<stdio.h>
int main()
{
int a,b[3],m,n;
scanf("%d",&a);
int d[2*a];
for(m=1;m<=a;m++)
scanf("%d",&d[m]);
scanf("%d",&b[0]);
scanf("%d",&b[1]);
scanf("%d",&b[2]);
for(n=0;n<3;n++)
{
for(m=1;m<=a-b[n];m++)
d[a+m]=d[b[n]+m];将交换位置后的数复制到原数组后面
for(m=1;m<=a-m+1;m++)
d[a-m+1]=d[b[n]-m+1];将交换位置前的数移到题设位置
for(m=1;m<=a-b[n];m++)
d[m]=d[m+a];将复制到原数组后面的数移到数组前面
for(m=1;m<=a;m++)
printf("%d ",d[m]);
printf("\n");
}
}
思路:
1 2 3 4 5
1 2 3 4 5 4 5
1 2 1 2 3 4 5
4 5 1 2 3