# 隨意輸入一個數字,用該數字內的數字組合出下一個比該數大的新數。
# 例如輸入14321 下一個是 21134
# 這類問題,除了能給出窮舉可能序列,而且找出下一個大的數字外
# 能夠經過,人工的羅列下幾個可能得數字找規律。
# 例如這一題的規則是:從後至前的找第一對逆序位置,交換逆序位置的元素,而且將前逆序位置後的數字進行順序的重排
1 #!/usr/bin/env python
2 import sys, re, os
3 def findinv( n, end ):
4 i = end
5 while i >= 1:
6 j = i-1
7 while j >= 0:
8 if n[i] > n[j]:
9 return j, i
10 j -= 1
11 i -= 1
12 return -1, -1
13
14 def reorder( n, i ):
15 for j in range(i, len(n)-1):
16 for k in range(j+1, len(n)):
17 if n[j] > n[k]:
18 x = n[j]
19 n[j] = n[k]
20 n[k] = x
21 return n
22
23 def next( n ):
24 end = len(n)
25 if end == 1: return ''.join( map(lambda x:str(x), n) ), False
26 last = n[end-1]
27 i, j = findinv( n, end - 1 )
28 if i==-1 and j==-1: return ''.join( map( lambda x:str(x),n) ), False
29 temp = n[i]
30 n[i] = n[j]
31 n[j] = temp
32 n = reorder(n, i+1)
33 return ''.join(map( lambda x:str(x), n ) ), True
34
35 a = int(sys.argv[1].strip())
36 num = []
37 while a>0:
38 num.append( a%10 )
39 a/=10
40 a = int(a)
41 num.reverse()
42 print num
43 print next( num )