解析:  比较难的一题,我在做题过程中遇到的问题及解决方案如下所示:

   1.题意的理解:百度一下知道原来是按照某种规则排序;

   2.如何排序:排序以从小到大的顺序。先找出最大的数字,看最大的数字的位置<1>在底部,就不用管了。

         <2>在顶部则直接倒着存储即可,记录底    部的位置 。<3>在其他位置记录该位置,将数组

         的数字从0到该位置倒过来存储,然后从底部倒过来。这样最大数字就到了最底部。以此类推。

      3.处理字符串:题目没有告诉总共的数量,因此必须以字符串的形式接受,通过函数转化为常规数据。

 

 1 #include <stdio.h>
 2 #include <math.h>
4 #include <string.h> 5 #define N 50 6 static int max(int n); 7 static void reverse(int n); 8 static int take(char *p); 9 int or[N], a[N]; 10 int main() 11 { 12 int n, i, j, k; 13 int flip[N*N]; 14 char ch[N*N]; 15 while(gets(ch) != NULL){ 16 n = take(ch); 17 for(i = 0; i < n - 1; i++) 18 printf("%d ", or[i]); 19 printf("%d\n", or[i]); 20 for(i = 0; i < n; i++){ 21 a[i] = or[i]; 22 } 23 k = 0; 24 for(i = n - 1; i >= 0; i--){ 25 /*让每一个相对的最大项都排到后面*/ 26 j = max(i); /*求前i项的最大项j*/ 27 if(j == i) /*已经排好序*/ 28 continue; 29 if(j != 0){ 30 flip[k] = n - j; 31 k++; 32 reverse(j); /*保证最大的一项在首位*/ 33 } 34 reverse(i); 35 flip[k] = n - i; /*将最大的一项翻到后面*/ 36 k++; 37 } 38 flip[k] = 0; 39 for(i = 0; i < k; i++) 40 printf("%d ", flip[i]); 41 printf("%d\n", flip[i]); 42 } 43 return 0; 44 } 45 /*求数组前n项的最大项*/ 46 static int max(int n) 47 { 48 int max = a[0]; 49 int i, k = 0; 50 for(i = 0; i <= n; i++) 51 if(a[i] > max){ 52 max = a[i]; 53 k = i; 54 } 55 return k; /*k就是最大的一项*/ 56 } 57 /*翻转数组的前n项*/ 58 static void reverse(int n) 59 { 60 int i, t; 61 int mid = n / 2; 62 for(i = 0; i <= mid; i++){ 63 t = a[i]; 64 a[i] = a[n-i]; 65 a[n-i] = t; 66 } 67 } 68 /*从字符串中取出数据,返回数组的长度*/ 69 static int take(char *p) 70 { 71 int i, j, k, l; 72 char *p1; 73 for(i = 0; i < N; i++) 74 or[i] = 0; 75 i = 0; 76 k = 0; 77 p1 = &p[i]; 78 while(p[i]){ 79 if(p[i] == ' '){ 80 p[i] = '\0'; 81 l = strlen(p1) - 1; 82 for(j = 0; j <= l; j++) 83 or[k] += (p1[j] - '0') * (int)pow(10, l - j); 84 k++; 85 p1 = &p[i+1]; 86 } 87 i++; 88 } 89 l = strlen(p1) - 1; 90 for(j = 0; j <= l; j++) 91 or[k] += (p1[j] - '0') * (int)pow(10, l - j); 92 k++; 93 return k; 94 }