有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。编写一函数实现上述功能,在主函数中输入n 个整数,并输出调整后的n个数。
思路一:将这n个数存放在一个数组中,利用指针数组指向每一个数组元素,再调整位置。
1 #include <stdio.h> 2 3 /** 4 *num[]:输入的数; 5 *n:输入数的个数; 6 *m:调前数的个数. 7 */ 8 void move(int num[], int n, int m) 9 { 10 int *p[n], *b[n]; 11 int i; 12 13 for(i = 0; i < n; i++) 14 { 15 p[i] = &num[i]; 16 } 17 18 for(i = 0; i < m; i++) 19 { 20 b[i] = p[i+n-m]; 21 } 22 for(i = m; i < n; i++) 23 { 24 b[i] = p[i-m]; 25 } 26 27 printf("Now,they are:\n"); 28 for(i = 0; i < n; i++) 29 { 30 printf("%d ",*b[i]); 31 } 32 } 33 34 int main() 35 { 36 int n, m, i; 37 38 printf("How many numbers:\n"); 39 scanf("%d",&n); 40 41 int num[n]; 42 43 printf("Please input these %d numbers:\n", n); 44 for(i = 0; i < n; i++) 45 { 46 scanf("%d", &num[i]); 47 } 48 49 printf("How many places you want to move:\n"); 50 scanf("%d", &m); 51 52 move(num, n, m); 53 54 return 0; 55 }
思路二:将这n个数存放在一个数组中,用指针指向该数组,利用指针调整数组中元素的位置。
#include <stdio.h> /** *array[]:输入的数; *n:输入数的个数; *m:调前数的个数. */ void move(int array[], int n, int m) { int *p, array_end; array_end = *(array+n-1); for(p = array+n-1; p > array; p--) { *p = *(p-1); } *array = array_end; m--; if(m > 0) move(array, n, m); }
int main() { int n, m, i; printf("How many numbers:\n"); scanf("%d",&n); int num[n]; printf("Please input these %d numbers:\n", n); for(i = 0; i < n; i++) { scanf("%d", &num[i]); } printf("How many places you want to move:\n"); scanf("%d", &m); move(num, n, m); printf("Now,they are:\n"); for(i = 0; i < n; i++) { printf("%d ",num[i]); } return 0; }
或者不用函数的递归有:
1 void move(int array[], int n, int m) 2 { 3 int *p, array_end, i; 4 for(i = 0; i < m; i++) 5 { 6 array_end = *(array+n-1); 7 for(p = array+n-1; p > array; p--) 8 { 9 *p = *(p-1); 10 } 11 *array = array_end; 12 } 13 }