Python编程小练习 | 算法题:津巴布韦的鸡蛋价格

文章目录

      • 题目:
      • 代码:
      • 简单分析:
      • 代码运行结果示例

题目:

Python编程小练习 | 算法题:津巴布韦的鸡蛋价格_第1张图片

代码:

from math import factorial
from random import shuffle

def getInput():

	num = eval(input())

	orginal__str = ''
	for i in range(num):
		orginal__str = orginal__str + input() + ' '
	
	value_and_m_list = orginal__str.split(' ')

	i = 0
	now_value_list = []
	m_list = []

	while i <= len(value_and_m_list) - 3:

		now_value_list.append(eval(value_and_m_list[i]))
		m_list.append(eval(value_and_m_list[i + 1]))

		i = i + 2

	return now_value_list,m_list

def getBeforeValue(now_value):

	rem = 0
	i = 10
	num_list = []
	while rem != now_value:
		new_rem = now_value % i
		num_list.append(str((new_rem - rem) // (i // 10)))
		rem = new_rem
		i = i * 10

	flag = factorial(len(set(num_list)))
	result = set()
	while len(result) < flag:
		shuffle(num_list)
		string = ''.join(num_list)
		result.add(string)

	before_value_list = list(result)

	return before_value_list


if __name__ == '__main__':
	
	now_value_list,m_list = getInput()
	
	for i in range(len(now_value_list)):

		now_value = now_value_list[i]
		m = m_list[i]

		before_value_list = getBeforeValue(now_value)
		result = []

		for value in before_value_list:
			if eval(value) > now_value and (eval(value) % m) == 0:
				result.append(value)

		print(result)

简单分析:

这个问题的核心在于将一个数字每个位的数提取出来再重新组合。但是,我在第一步获取输入时就遇到了一点麻烦,解决方法看起来也很繁琐:

def getInput():

	num = eval(input())

	orginal__str = ''
	for i in range(num):
		orginal__str = orginal__str + input() + ' '
	
	value_and_m_list = orginal__str.split(' ')

	i = 0
	now_value_list = []
	m_list = []

	while i <= len(value_and_m_list) - 3:

		now_value_list.append(eval(value_and_m_list[i]))
		m_list.append(eval(value_and_m_list[i + 1]))

		i = i + 2

	return now_value_list,m_list

首先,这个函数获取到输入的组数num,再通过循环将之后的输入变成一个长字符串;获取到长字符串之后再将其划分,转换成一个长列表,之后将这个长列表分组,获得鸡蛋现在的价格组和糖果的价格组。由于字符串划分转换为列表后出现了一些异常元素(最后有一个空格),所以这段代码看起来并不是很优美。

通过这个函数我们获取到了输入并将其转化为可以方便使用的数据格式。

让我们看看主要的程序框架:

if __name__ == '__main__':
	
	now_value_list,m_list = getInput()
	
	for i in range(len(now_value_list)):

		now_value = now_value_list[i]
		m = m_list[i]

		before_value_list = getBeforeValue(now_value)
		result = []

		for value in before_value_list:
			if eval(value) > now_value and (eval(value) % m) == 0:
				result.append(value)

		print(result)

在主程序中,我们将进行循环,每次循环处理一组鸡蛋和糖果的价格,通过另一个函数将鸡蛋的价格重排后,再进行循环去检测这些重排值是否符合要求,将符合要求的值添加进列表后打印。

主程序比较简单,那么最后的问题就是最关键的函数:

def getBeforeValue(now_value):

	rem = 0
	i = 10
	num_list = []
	while rem != now_value:
		new_rem = now_value % i
		num_list.append(str((new_rem - rem) // (i // 10)))
		rem = new_rem
		i = i * 10

	flag = factorial(len(num_list))
	result = set()
	while len(result) < flag:
		shuffle(num_list)
		string = ''.join(num_list)
		result.add(string)

	before_value_list = list(result)

	return before_value_list

通过一个类似找规律计算的过程,我写出了将数字的每个位提出来的算法。但是将这些提取好的、数量不定的数字重新组合成一个数,我没想到其它的好办法,只能选择比较笨的穷举,再通过列表转换为集合来去重。

代码运行结果示例

5 
321 3
123 3
422 2
15948 5
15948 2
['312', '132', '123', '231', '213']
[]
['224']
['14985', '14895']
['14598', '15894', '15498', '14958']

注意:需要去重的除了穷举出来的数之外,被按位分出来的个位数也需要去重,否则遇到某两个位上的数相同的情况时会进入死循环。

你可能感兴趣的:(Python基础,python,算法)