数字内组合得到下一个比该数大的数

# 随意输入一个数字,用该数字内的数字组合出下一个比该数大的新数。
# 例如输入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 )

 

转载于:https://www.cnblogs.com/25-to-life/p/4479378.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值