一、题目描述:(408联考 2010真题)
二、算法思想:
可以将这个问题看作是把数组ab转换为ba(a代表数组的前p个元素,b代表数组中的余下n-p个元素),先将a逆置得到a-1b,再将b逆置得到a-1b-1,最后将整个a-1b-1逆置为(a-1b-1)-1=ba。
三、核心代码:
void Reverse(int R[],int from,int to)
{
int temp;
int i;
for(i=0;i<(to-from+1)/2;i++)
{
temp=R[from+i];
R[from+i]=R[to-i];
R[to-i]=temp;
}
}
void Converse(int R[],int n,int p)
{
Reverse(R,0,p-1);
Reverse(R,p,n-1);
Reverse(R,0,n-1);
}
四、完整代码:
#include<stdio.h>
void Reverse(int R[],int from,int to);
void Converse(int R[],int n,int p);
void Print(int R[],int n);
int main()
{
int R[10]={0,1,2,3,4,5,6,7,8,9};
int n;
int p;
n=sizeof(R)/sizeof(int);
printf("please input the value of p:");
scanf("%d",&p);
Converse(R,n,p);
Print(R,n);
return 0;
}
void Reverse(int R[],int from,int to)
{
int temp;
int i;
for(i=0;i<(to-from+1)/2;i++)
{
temp=R[from+i];
R[from+i]=R[to-i];
R[to-i]=temp;
}
}
void Converse(int R[],int n,int p)
{
Reverse(R,0,p-1);
Reverse(R,p,n-1);
Reverse(R,0,n-1);
}
void Print(int R[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d",R[i]);
}
五、测试结果: