解题思路:
①:设数组元素为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 条评论

stolen 2年前 回复TA
#include<stdio.h>
void move(int a[],int n,int m){
	int i;
	for(i=n-m;i<n;i++){ // 10-2;
		printf("%d ",a[i]);
	}
	for(i=0;i<n-m;i++){
		printf("%d ",a[i]);
	}
}
int main(){
	int i; // int i
	int m,n;//输入多少和移动多少;
	int a[100];
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	} 
	scanf("%d",&m); //移动的位数;
	move(a,n,m);
	return 0;
}
玛卡巴卡 2年前 回复TA
#include<stdio.h>

void fun(int *a,int *b,int n,int m)
{
	int i;
	for(i = 0;i < (n - m);i++)
	{
		b[m + i] = a[i];
	}
	for(i = 0;i < m;i++)
	{
		b[i] = a[n - m + i];
	}
}

int main()
{
	int n,m,a[100],b[100];
	int i;
	scanf("%d",&n);

	for(i = 0;i < n;i++)
		scanf("%d",&a[i]);

	scanf("%d",&m);

	fun(a,b,n,m);

	for(i = 0;i < n;i++)
		printf("%d ",b[i]);
	printf("\n");
	return 0;
}
陈志超 2年前 回复TA
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
    int main() {
    int m,p[100],n,pp[100],i;
    scanf("%d",&m);
    for(i=0;i<m;i++)
    scanf("%d",&p[i]);
    scanf("%d",&n);
    for(i=0;i<m-n;i++)
    pp[i+n]=p[i];
    for(i=0;i<n;i++)
    pp[i]=p[i+m-n];
    for(i=0;i<m;i++)
    printf("%d ",pp[i]);
    
	return 0;
    }
1021王俊峰 2年前 回复TA
#include<stdio.h>  //直接输出就行了
 int main()
	 {
	   int i,j;
	   int m,n;
	   int a[100];
	   scanf("%d",&n);
	   for(i=0;i<n;i++)
	   {
	   	scanf("%d",&a[i]);
		} 
		scanf("%d",&m);
	   for(i=n-m;i<n;i++)
	   {
	   	printf("%d ",a[i]);
	   }
	   for(i=0;i<n-m;i++)
	   {
	   	printf("%d ",a[i]);
	   }
	 	return 0;
	  }
名字好难想 2年前 回复TA
@爱你 你那个函数里面n已经等于7了,所以你主体里面n要减2
KK 2年前 回复TA
/*思路:先用另一个数组b复制数组a,对数组a从最后一个开始各自向后移动m位(全部执行)
去掉尾部“被顶出”的m个元素,从数组b取这m个数然后在数组a的头部补上*/

#include<stdio.h>

int n,m,i;
int a[100],b[100];
void display()
{
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    
    scanf("%d",&m);
    
    for(i=n-1;i>=0;i--)
    {
        b[i]=a[i];
        a[i]=a[i-m];//比如10个数,要后移2位,用a[7]赋给a[9],a[6]赋给a[8]依次类推
    }
    for(i=n-1;i>=n-m;i--)
    {
        a[i-(n-m)]=b[i];//根据例子推出的公式,如b[9]赋给a[1],b[8]赋给a[0],后移m位,b和a的下标相差n-m
    }
}

int main()
{
    scanf("%d",&n);
    
	display();
	
	    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
	return 0;
}
爱你 2年前 回复TA
#include <stdio.h>
int n,m;
int main()
{
	void move(int a[]);
	int a[1000],i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	scanf("%d",&m);
	move(a);
	for(i=0;i<n;i++)
		printf("%d",a[i]);
	return 0;
}
void move(int a[])
{
	int i,j=0;
	for(i=n-1;i>=0;i--)
		a[i+m]=a[i];
	for(j=0;j<m;j++)
	{
		a[j]=a[n];
	    n++;
	}
}
大佬们我这个为啥答案错误啊,输出结果是9 10 1 2 3 4 5 6 7 8 9 10
佐佐木小次郎 3年前 回复TA
这个是我看到最妙的一个了
张健 4年前 回复TA
#include<stdio.h>
int main()
{
	int n;
	scanf("%d", &n);
	int a[100];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	int m;
	scanf("%d", &m);
	int b[100];
	for (int j = 0; j < n; j++)
	{
		b[j] = a[(j+n-m)%n];
	}
	for (int j = 0; j < n; j++)
	{
		printf("%d ", b[j]);
	}
	return 0;
}
踏上星辰 4年前 回复TA
#include <stdio.h>
int main(void)
{
	int n;
	int b[1024] = { 0 };
	int a=0;
	int m=0;
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++)
	{	
		scanf_s("%d", &a);
		b[i] = a;
	}
	scanf_s("%d",& m);
	for (int i = 0; i < m; i++)
		printf("%d ", b[n + i - m]);
	for (int i = 0; i < 10 - m; i++)
		printf("%d ", b[i]);
	return 0;
}