本题有两种方法: 方法一:递推法 ///递推法:根据规律,从最后面字母ai依次向前搜寻,若找到第一个字母bi比ai大, ///则将ai与bi交换,并将原bi之后的字母从小到大重新排列;若未找到则从次最后搜寻,如此等等 #include<stdio.h> #include<string.h> #define LOCAL char s[55],ch; int len; void decide() { int i,j,k,ok=0; for(i=0;i<len-1;i++) if(s[i]<s[i+1]) { ok=1; break; } if(!ok) { printf("No Successor/n"); return ; } ok=0; for(i=len-1;i>=1;i--) { for(j=i-1;j>=0;j--) if(s[i]>s[j]) { ch=s[i]; s[i]=s[j]; s[j]=ch; ok=1; break; } if(ok) break; } for(k=1;k<=len-1-j;k++) for(i=j+1;i<len-1;i++) { if(s[i]>s[i+1]) { ch=s[i]; s[i]=s[i+1]; s[i+1]=ch; } } printf("%s/n",s); } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif while(1) { scanf("%s",s); ///printf("%s/n--------/n",s);/ len=strlen(s); if(s[0]=='#') return 0; else decide(); } return 0; } 方法二:利用algorithm头文件中的next_permutation()函数求下个排列 ///利用algorithm中的next_permutation(s,s+length)函数,学习使用STL中的函数 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define LOCAL char les[55]; int ok,len; void decide() { int i,flag=1,j,cou=0; ok=0; len=strlen(les); for(i=0;i<len-1;i++) if(les[i]<les[i+1]) { flag=0; break; } if(flag) { printf("No Successor/n"); return ; } next_permutation(les,les+len); printf("%s/n",les); } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif while(1) { scanf("%s",les); if(les[0]=='#') break; else decide(); } return 0; }