十进制整数本质上是一个数字数组。一些简单的数学运算将允许对整数中的这些数字进行索引,就像任何其他数组一样。
以下 python 示例代码将利用这一事实完全满足您的需求:
#!/usr/bin/python3
def getNumDigits(number):
if number == 0:
digits = 1
else:
digits = 0
while number > 0:
digits += 1
number //= 10
return digits
def getDigitAtPosition(position, number):
return (number // (10**position)) % 10
def swapDigits(number, position_one, position_two):
digit_one = getDigitAtPosition(position_one, number)
digit_two = getDigitAtPosition(position_two, number)
difference = digit_one - digit_two
return number + (difference * 10**position_two) - (difference * 10**position_one)
def sortNumber(number, num_digits=None):
if num_digits is None:
num_digits = getNumDigits(number)
for i in range(num_digits-1):
for j in range(i+1, num_digits):
if getDigitAtPosition(j, number) < getDigitAtPosition(i, number):
number = swapDigits(number, i, j)
return number
def isDigitInNumber(digit, number):
for i in range(getNumDigits(number)):
if getDigitAtPosition(i, number) == digit:
return True
return False
def printCombinations_sorted(number, prepend, num_digits):
if num_digits == 1:
print(number + (prepend * (10**num_digits)))
else:
lead_position = num_digits-1
lead_digit = getDigitAtPosition(lead_position, number)
digits_swapped = lead_digit
printCombinations_sorted(number % 10**(lead_position), (prepend*10) + lead_digit, num_digits-1)
for i in range(num_digits-1):
sub_number = swapDigits(number, num_digits-1, num_digits-2-i)
sub_lead_digit = getDigitAtPosition(lead_position, sub_number)
if not isDigitInNumber(sub_lead_digit, digits_swapped):
digits_swapped = digits_swapped*10 + sub_lead_digit
printCombinations_sorted(sub_number % 10**(lead_position), (prepend*10) + sub_lead_digit, num_digits-1)
def printCombinations(number):
num_digits = getNumDigits(number)
number = sortNumber(number, num_digits)
printCombinations_sorted(number, 0, num_digits)
if __name__ == "__main__":
number = 101010
printCombinations(number)
由于没有指定是否允许重复数字,所以我假设它们会这样写。如果不是这样,它可以简化很多。