解题思路:
①:设数组元素为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] ); }
别忘点赞哦-.-
0.0分
56 人评分
求问一下为什么这样子是错误的,请问一下缺陷在哪里 输入了一些数据,觉得没有问题呀 #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; }
C二级辅导-同因查找 (C语言代码)浏览:660 |
C二级辅导-计负均正 (C语言代码)浏览:592 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:615 |
printf基础练习2 (C语言代码)浏览:567 |
简单的a+b (C语言代码)浏览:667 |
【计算两点间的距离】 (C语言代码)浏览:879 |
【明明的随机数】 (C++代码)浏览:779 |
十->二进制转换 (C语言代码)浏览:1291 |
【偶数求和】 (C语言代码)浏览:556 |
三角形 (C++代码)记忆化搜索浏览:1220 |
大陈 2018-10-16 13:15:33 |
不好意思,我前面错了,将(i+m)%n改成(i+n-m)%n 程序就对了