一、题目描述:(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]); }
五、测试结果: