解题思路:
①:设数组元素为n,移动位置为m,数组为A[]

②:把最后m个数变为前面m个数,相当于把数组A循环左移n-m个元素

③:要实现A中序列循环左移n-m个位置只需

1):先把A中前n-m个元素逆置

2):再把A中剩下的元素逆置

3):最后把A中所有元素整体逆置

逆置实现:

void Reverse(int *A,int p,int q)/*把p到q个数做一次逆置操作*/
{
   int term;
  for(int i=p,j=q;i<j;i++,j--)/*进行逆置换*/
    {
      term=A[i];
      A[i]=A[j];
      A[j]=term;
    }

}

④:输出结果


参考代码:

#include <stdio.h>
#include <malloc.h>

void Reverse( int *A, int p, int q );   /*把p到q个数做一次逆置操作*/
void con_vert( int *A, int n );         /*总转换函数*/
void input_data( int *A, int n );       /*输入数组元素*/
void out_put( int *A, int n );          /*输出函数*/

/*======================================*/

int main()
{
    int    *A;
    int    n, m;
    while ( scanf( "%d", &n ) != EOF )
    {
        A = (int *) malloc( n * sizeof(int) );  /*为数组开辟空间*/
        input_data( A, n );                     /*输入数据*/
        con_vert( A, n );                       /*进行转换*/
        out_put( A, n );                        /*输出结果*/
        free( A );                              /*释放空间*/
    }
    return(0);
}


/*======================================*/
void input_data( int *A, int n )                        /*输入数组元素*/
{
    for ( int i = 0; i < n; i++ )
        scanf( "%d", &A[i] );
}


/*======================================*/
void con_vert( int *A, int n )  /*总转换函数*/
{
    int m;
    scanf( "%d", &m );      /*输入开始移动的位置*/
    if ( m <= 0 || m >= n )/*判断输入位置是否合法*/
        return;
    else{
        Reverse( A, 0, n - m - 1 );
        Reverse( A, n - m, n - 1 );
        Reverse( A, 0, n - 1 );
    }
}


/*======================================*/
void Reverse( int *A, int p, int q )                    /*把p到q个数做一次逆置操作*/
{
    int term;
    for ( int i = p, j = q; i < j; i++, j-- )       /*进行逆置换*/
    {
        term    = A[i];
        A[i]    = A[j];
        A[j]    = term;
    }
}


/*======================================*/
void out_put( int *A, int n ) /*输出函数*/
{
    for ( int i = 0; i < n - 1; i++ )
        printf( "%d ", A[i] );
    printf( "%d\n", A[n - 1] );
}

别忘点赞哦-.-

点赞(19)
 

0.0分

54 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 35 条评论

黑飞蛾 5年前 回复TA
我只能说思路很好,但是说时间和空间两方面高效就。。。。。。。。
编程不好不换网名 5年前 回复TA
#include<stdio.h>
#define N 50
void main()
{
	int n,a[N];
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	int m;
	scanf("%d",&m);
	for(int j=0;j<m;j++)
	{   int t=a[j];
		a[j]=a[n-m+j];
		a[n-m+j]=t;
	}
	for(i=0;i<n;i++)
		printf("%d ",a[i]);
	printf("\n");
}
这样不是更简单吗?运行也没问题,为什么编译错误?有人帮我看看吗?谢谢
月下萤火 5年前 回复TA
#include<stdio.h>
#include<string.h>
#include<math.h>

int main() {

	int n,a[n],m,t;
	scanf("%d",&n);
	
	for(int i=0; i<n; i++) {
		scanf("%d",&a[i]);
	}

	scanf("%d",&m);

	for(int i=0; i<m; i++) {
		t=a[n-1];
		for(int j=n-1; j>0; j--) {
			a[j]=a[j-1];
		}
		a[0]=t;
	}

	for(int i=0; i<n; i++) {
		printf("%d ",a[i]);
	}

	return 0;
}
编译器编译没问题但提交就运行错误,有没有大佬看下哪里数组越界还是什么原因
大陈 6年前 回复TA
@大陈 不好意思,我前面错了,将(i+m)%n改成(i+n-m)%n 程序就对了
大陈 6年前 回复TA
求问一下为什么这样子是错误的,请问一下缺陷在哪里
输入了一些数据,觉得没有问题呀
#include"iostream"
using namespace std;
#define MAX 1000
void putin(int a[],int n)			//输入数组
{
	for (int i = 0; i < n; i++)
		cin >> a[i];
}
void putout(int a[], int n, int m)		//输出数组
{
	for (int i = 0; i < n; i++)
		cout << a[(i + m) % n] << " ";			//0<=(i+m)%n < n
}
int main()
{
	int arr[MAX], n, m;	
	cin >> n;
	putin(arr,n);
	cin >> m;
	putout(arr, n, m);
	return 0;
}