这是我在Stack Overflow上的第一篇文章,希望它是好的。
这是一个我自己想出来的问题,现在我有点尴尬地说,但它正在打败我。请注意,这不是一个作业练习,童子军的荣誉。
基本上,该程序将一个由0到9的整数组成的字符串作为输入。
答案2 = 241、5、0、43(241 + 5 + 0 + 43 = 289)。
请注意,整数的位置不会改变。它们仍然按照原始字符串中的顺序排列。
现在,我知道如何使用递归解决这个问题。但令人沮丧的是,我不被允许使用递归。
这需要使用只有while和for循环来解决。当然,也可以使用列表和函数。
以下是我目前的一些代码:我的代码:
基本上,伪代码会像这样:
伪代码:
好的,这是程序逻辑的基本流程。现在我需要解决的唯一问题就是如何在没有递归的情况下使其工作。
对于那些一直阅读到这里的人,我真诚地感谢你们,并希望你们还有精力来帮助我解决这个问题。如果有任何不清楚的地方,请问我,我会详细解释的。
再次感谢!
编辑:2011年9月1日
非常感谢大家的回复和答案。它们都非常好,肯定比我走过的路线更加优雅。然而,我的学生从未使用“import”或任何比列表更高级的数据结构。但是,他们确实知道很多列表函数。
我还应该指出,这些学生在数学上非常有天赋,其中许多人曾参加并获得了国际数学奥林匹克竞赛的奖项。因此,这项任务并不超出他们的智力范围,也许只是超出了他们的Python知识范围。
昨晚我有了一个顿悟时刻。我还没有实现它,但会在周末期间完成并在这里发布我的结果。它可能有点粗糙,但我认为它能完成任务。
很抱歉让我这么久才回复,我的网络流量已经用完了,我不得不等到1日才能重置。顺便提一下,对于在南半球的人来说,春天快乐。
再次感谢你们的贡献。周末后我会选择最佳答案。
问候!
这是一个我自己想出来的问题,现在我有点尴尬地说,但它正在打败我。请注意,这不是一个作业练习,童子军的荣誉。
基本上,该程序将一个由0到9的整数组成的字符串作为输入。
strInput = '2415043'
那么你需要将那一串数字拆分成更小的数字组,直到最终这些组的总和等于预定义的总数。 在上述字符串的情况下,目标是289。
iTarget = 289
对于这个例子,有两个正确答案(但最有可能只显示一个,因为程序一旦达到目标就会停止):
Answer 1 = 241, 5, 043 (241 + 5 + 043 = 289)
答案2 = 241、5、0、43(241 + 5 + 0 + 43 = 289)。
请注意,整数的位置不会改变。它们仍然按照原始字符串中的顺序排列。
现在,我知道如何使用递归解决这个问题。但令人沮丧的是,我不被允许使用递归。
这需要使用只有while和for循环来解决。当然,也可以使用列表和函数。
以下是我目前的一些代码:我的代码:
#Pre-defined input values, for the sake of simplicity
lstInput = ['2','4','1','5','0','4','3'] #This is the kind of list the user will input
sJoinedList = "".join(lstInput) #sJoinedList = '2415043'
lstWorkingList = [] #All further calculuations are performed on lstWorkingList
lstWorkingList.append(sJoinedList) #lstWorkingList = ['2415043']
iTarget = 289 #Target is pre-defined
-
def SumAll(_lst): #Adds up all the elements in a list
iAnswer = 0 #E.g. lstEg = [2,41,82]
for r in _lst: # SumAll(lstEg) = 125
iAnswer += int(r)
return(iAnswer)
-
def AddComma(_lst):
#Adds 1 more comma to a list and resets all commas to start of list
#E.g. lstEg = [5,1001,300] (Note only 3 groups / 2 commas)
# AddComma(lstEg)
# [5,1,0,001300] (Now 4 groups / 3 commas)
iNoOfCommas = len(_lst) - 1 #Current number of commas in list
sResetString = "".join(_lst) #Make a string with all the elements in the list
lstTemporaryList = []
sTemp = ""
i = 0
while i < iNoOfCommas +1:
sTemp += sResetString[i]+',' #Add a comma after every element
i += 1
sTemp += sResetString[i:]
lstTemporaryList = sTemp.split(',') #Split sTemp into a list, using ',' as a separator
#Returns list in format ['2', '415043'] or ['2', '4', '15043']
return(lstTemporaryList)
return(iAnswer)
基本上,伪代码会像这样:
伪代码:
while SumAll(lstWorkingList) != iTarget: #While Sum != 289
if(len(lstWorkingList[0]) == iMaxLength): #If max possible length of first element is reached
AddComma(lstWorkingList) #then add a new comma / group and
Reset(lstWorkingList) #reset all the commas to the beginning of the list to start again
else:
ShiftGroups() #Keep shifting the comma's until all possible combinations
#for this number of comma's have been tried
#Otherwise, Add another comma and repeat the whole process
哎呀,这真是够啰嗦的。
我已经在纸上详细写下了程序所要遵循的流程,因此以下是预期的输出结果:
输出:
[2415043] #Element 0 has reached maximum size, so add another group
#AddComma()
#Reset()
[2, 415043] #ShiftGroups()
[24, 15043] #ShiftGroups()
[241, 5043] #ShiftGroups()
#...etc...etc...
[241504, 3] #Element 0 has reached maximum size, so add another group
#AddComma()
#Reset()
[2, 4, 15043] #ShiftGroups()
[2, 41, 5043] #ShiftGroups()
#etc...etc...
[2, 41504, 3] #Tricky part
现在来到了棘手的部分。 在下一步中,第一个元素必须变成24,而其他两个必须重置。
#Increase Element 0
#All other elements Reset()
[24, 1, 5043] #ShiftGroups()
[24, 15, 043] #ShiftGroups()
#...etc...etc
[24, 1504, 3]
#Increase Element 0
#All other elements Reset()
[241, 5, 043] #BINGO!!!!
好的,这是程序逻辑的基本流程。现在我需要解决的唯一问题就是如何在没有递归的情况下使其工作。
对于那些一直阅读到这里的人,我真诚地感谢你们,并希望你们还有精力来帮助我解决这个问题。如果有任何不清楚的地方,请问我,我会详细解释的。
再次感谢!
编辑:2011年9月1日
非常感谢大家的回复和答案。它们都非常好,肯定比我走过的路线更加优雅。然而,我的学生从未使用“import”或任何比列表更高级的数据结构。但是,他们确实知道很多列表函数。
我还应该指出,这些学生在数学上非常有天赋,其中许多人曾参加并获得了国际数学奥林匹克竞赛的奖项。因此,这项任务并不超出他们的智力范围,也许只是超出了他们的Python知识范围。
昨晚我有了一个顿悟时刻。我还没有实现它,但会在周末期间完成并在这里发布我的结果。它可能有点粗糙,但我认为它能完成任务。
很抱歉让我这么久才回复,我的网络流量已经用完了,我不得不等到1日才能重置。顺便提一下,对于在南半球的人来说,春天快乐。
再次感谢你们的贡献。周末后我会选择最佳答案。
问候!
lstWorkingList
?呸! - johnsyweb