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

dotcpp0712666 1年前 回复TA
@dotcpp0712666 好吧被吞了
dotcpp0712666 1年前 回复TA
@dotcpp0712666 #include <stdio.h> int main() {     int n, m, t = 0;     scanf("%d", &n);     int a[n];     for (int i = 0; i < n; i++)     {         scanf("%d", &a[i]);     }     scanf("%d", &m);     int b[m];     // 把a数组后m个数保存到b数组     for (int i = n - m; i < n; i++) // 假设n=10,m=2  10-2=8 i<10  1 2 3 4 5 6 7 8 9 10 b[0]=9 b[1]=10     {         b[t] = a[i];         t++;     }     // 把a数组后移m位     for (int i = 9; i >= 0; i--)     { // a[9]=a[7] =8  a[8]=a[6] =7...交换后  1 2 1 2 3 4 5 6 7 8         a[i] = a[i - m];     }     // 把b数组接到a数组前面实现移动的效果?     for (int i = 0; i < m; i++)     {         a[i] = b[i];     }      // 排序后     for (int i = 0; i < n; i++)     {         printf("%d ", a[i]);     } }
dotcpp0712666 1年前 回复TA
先把a数组n-m保存到b数组
再把a数组后移m 然后把b数组接到a前面



#include <stdio.h>

int main()

{

    int n, m, t = 0;

    scanf("%d", &n);

    int a[n];

    for (int i = 0; i < n; i++)

    {

        scanf("%d", &a[i]);

    }

    scanf("%d", &m);

    int b[m];

    // 把a数组后m个数保存到b数组

    for (int i = n - m; i < n; i++) // 假设n=10,m=2  10-2=8 i<10  1 2 3 4 5 6 7 8 9 10 b[0]=9 b[1]=10

    {

        b[t] = a[i];

        t++;

    }

    // 把a数组后移m位

    for (int i = 9; i >= 0; i--)

    { // a[9]=a[7] =8  a[8]=a[6] =7...交换后  1 2 1 2 3 4 5 6 7 8

        a[i] = a[i
龙炜 1年前 回复TA
scanf("%d", &n);
	for (i = 0;i < n;i++) {
		scanf("%d", &arr[i]); // 输入
	}
	scanf("%d", &m);
	move(arr, n, m);

	for (i = 0;i < 10;i++) {
		printf("%d ", arr[i]); // 输出
	}
	return 0;
}


本人新手,不喜勿喷,谢谢!
龙炜 1年前 回复TA
#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

int move(int arr[], int n,int m) {
	int i = 0, j = 0, brr[100] = { 0 }, b = 0;
	for (i = n-m;i <n;i++){
		brr[j++] = arr[i]; //将数组后面要移的元素存到新数组brr里
	}
	for (i = 0;i < m;i++) {
		for (j = n-m-1+i;j >=i;j--){ // 双循环将数组逐次后移  内循环 1arr[0-->8]-->arr[1-->9}
			arr[j + 1] = arr[j];     //                     内循环 2arr[1-->9]-->arr[2-->10]
		}
	} 
	for (i = 0;i < m;i++) {// 再将后面的元素连接到数组前面
		arr[i] = brr[b++];
	}
	return 0;
} 

int main() {
	int n = 0, i = 0, m = 0;
	int arr[1000] = { 0 };
	scanf("%d", &n);
	for (i = 0;i < n;i++) {
		scanf("%d", &arr[i]
余波 1年前 回复TA
@在路上 这个偏移量又不是固定的2,你理解有误
新手上路 2年前 回复TA
#include<iostream>
using namespace std;
void reverse(int a[],int size){
    for(int i=0; i<size/2; i++){
        int temp = a[i];
        a[i] = a[size-i-1];
        a[size-i-1] = temp;
    }
}
int main() {
    int n;
    cout << "请输入位数"<< endl;
    cin >> n;
    int *a=new int[n];
    cout << "请输入数组"<< endl;
    for (int i = 0; i < n; i++){
        cin>>a[i];
    }
    int m;
    cout << "请输入偏移量"<< endl;
    cin >> m;
    reverse(a,n);
    reverse(a,m);
    reverse(a+m,n-m);
    for (int i = 0; i < n; i++){
        cout<<a[i]<<' ';
    }
    delete [] a;
}
请问我这个为什么答案错误
在路上 2年前 回复TA
@在路上 大佬求解
在路上 2年前 回复TA
#include<stdio.h>
int main()
{
	int a[12];
	int i;
	for(i=2;i<12;i++)
	{
		scanf("%d",&a[i]);
	}
	a[0]=0;
	a[1]=0;
	int w;
	w=a[10];a[10]=a[0];a[0]=w;
	w=a[11];a[11]=a[1];a[1]=w;
	
	for(i=0;i<10;i++)
	{
		printf("%d",a[i]);
	}
}
为啥他说我结果错误
xiebosshh 2年前 回复TA
#include<stdio.h>
int main()
{
   int a[1000];
   int b[1000];
   int i,j,n,m,k,l;
   scanf("%d",&n);
   for(i=0;i<n;i++){
    scanf("%d",&a[i]);
   }
   scanf("%d",&m);
   for(j=0;j<m;j++){
     b[m-1-j]=a[n-1-j];
   }
   for(l=0;l<m;l++){
    printf("%d ",b[l]);
   }
   for(k=0;k<n-m;k++){
      printf("%d ",a[k]);
   }

    return 0;
}