题目看了半天......英语啊!!!
好久没做题...循环输入数字都搞了半天...罪过啊!!!
还是C方便一点...其实C++应该更方便的...C++得再看看!!!
#include <iostream> #include <cstdio> using namespace std; /*翻转*/ void myReverse(int arr[],int s,int e) { while (s<e) { int temp=arr[s]; arr[s]=arr[e]; arr[e]=temp; s++; e--; } } int main(void) { int temp; while (scanf("%d",&temp)!=EOF) { int myArr[30]; myArr[0]=temp; int myCount=1; while (getchar()!='\n') { cin>>myArr[myCount++]; } /*输出原始的*/ for (int i=0;i<myCount-1;i++) { cout<<myArr[i]<<" "; } cout<<myArr[myCount-1]<<endl; for (int i=myCount-1;i>=0;i--) //针对此次最大的数 { /*先找到此次最大数的位置*/ int thisMaxIndex=i; //注意记录的是下标 for (int j=i-1;j>=0;j--) { if (myArr[j]>myArr[thisMaxIndex]) { thisMaxIndex=j; } } if(thisMaxIndex==i) //此次的最后一个已经是最大的了,不要操作 { continue; } else if(thisMaxIndex==0) //最大的第一个数, { cout<<(myCount-i)<<" "; //直接从后面翻一下,注意输出 myReverse(myArr,0,i); } else { cout<<(myCount-thisMaxIndex)<<" "; myReverse(myArr,0,thisMaxIndex); i++; //再继续此次循环 } } cout<<"0\n"; //最后输出0; } return 0; }
总结:
1.while (scanf("%d",&temp)!=EOF)的循环输入判读
2.while (getchar()!='\n') { cin>>myArr[myCount++];} 看输入,读了一个数字之后紧接着要么是一个空格,要么是结尾的换行符,这里这代码漂亮!空格读了就不要了然后直接读数字,是换行就退出了循环,紧密结合了实际!
3.每次循环的处理,最外层是由后向前,保证处理过的都是有序的大的数.每次循环,要是不合要求再 i-- ,即再来这次循环!