1 Obtaining a sum from a subsequence of digits
Write a program sum_of_digits.py that prompts the user for two numbers, say available_digits
and desired_sum, and outputs the number of ways of selecting digits from available_digits that
sum up to desired_sum. For instance, if available_digits is 12234 and sum is 5 then there are
4 solutions:
• one solution is obtained by selecting 1 and both occurrences of 2 (1 + 2 + 2 = 5);
• one solution is obtained by selecting 1 and 4 (1 + 4 = 5);
• one solution is obtained by selecting the first occurrence of 2 and 3 (2 + 3 = 5);
• one solution is obtained by selecting the second occurrence of 2 and 3 (2 + 3 = 5).
Here is a possible interaction:
$ python3 sum_of_digits.pyInput a number that we will use as available digits: 12234
Input a number that represents the desired sum: 5
There are 4 solutions.
$ python3 sum_of_digits.pyInput a number that we will use as available digits: 11111
Input a number that represents the desired sum: 5
There is a unique solution.
$ python3 sum_of_digits.pyInput a number that we will use as available digits: 11111
Input a number that represents the desired sum: 6
There is no solution.
$ python3 sum_of_digits.pyInput a number that we will use as available digits: 1234321
Input a number that represents the desired sum: 5
There are 10 solutions.
1
#我的解法
#这里用到了itertools的一个函数
#-》itertools.combinations(List,i)
#作用是将列表中的元素进行排列组合,实现这里的问题可以简洁不少
# Prompts the user for two numbers, say available_digits and desired_sum, and
# outputs the number of ways of selecting digits from available_digits
# that sum up to desired_sum.
import sys
import itertools
def solve(available_digits, desired_sum):
if desired_sum < 0:
return 0
string=list(str(available_digits))
List_string=[]
for i in string:
List_string.append(int(i))
#print(List_string)
L=[]
for i in range(1,len(List_string)+1):
L.append(list(itertools.combinations(List_string,i)))
#print(L)
L_sum=[]
for i in L:
for j in i:
sum=0
for k in j:
sum+=k
L_sum.append(sum)
nb_of_solutions=0
for i in L_sum:
if i==desired_sum:
nb_of_solutions+=1
return nb_of_solutions
try:
available_digits = abs(int(input('Input a number that we will use as available digits: ')))
except ValueError:
print('Incorrect input, giving up.')
sys.exit()
try:
desired_sum = int(input('Input a number that represents the desired sum: '))
except ValueError:
print('Incorrect input, giving up.')
sys.exit()
nb_of_solutions = solve(available_digits, desired_sum)
if nb_of_solutions == 0:
print('There is no solution.')
elif nb_of_solutions == 1:
print('There is a unique solution.')
else:
print(f'There are {nb_of_solutions} solutions.')
#马丁解法
#一行迭代解决所有问题
#要理解的是下面两个式子
#solve(available_digits // 10, desired_sum) 第一个式子,比较前面迭代过程中所有可以匹配的desired_sum(本身指向前一个,就是目的值,但前一个的第一个式子又将其指向再前一个就是desired_sum - available_digits % 10,在迭代的过程中考虑了所有的可能性) 这个式子代表不包含当前值的所有情况。
#solve(available_digits // 10, desired_sum - available_digits % 10)让后面的每次迭代都考虑到目标值包含此位数值的情况 这个式子代表包含此位数值的所有情况。
import sys
def solve(available_digits, desired_sum):
if desired_sum < 0:
return 0
if available_digits == 0:
if desired_sum == 0:
return 1
return 0
# Either take the last digit d form available_digits
# and try to get desired_sum - d from the remaining digits,
# or do not take the last digit and try to get desired_sum
# from the remaining digits.
return solve(available_digits // 10, desired_sum) +\
solve(available_digits // 10, desired_sum - available_digits % 10)
try:
available_digits = abs(int(input('Input a number that we will use as available digits: ')))
except ValueError:
print('Incorrect input, giving up.')
sys.exit()
try:
desired_sum = int(input('Input a number that represents the desired sum: '))
except ValueError:
print('Incorrect input, giving up.')
sys.exit()
nb_of_solutions = solve(available_digits, desired_sum)
if nb_of_solutions == 0:
print('There is no solution.')
elif nb_of_solutions == 1:
print('There is a unique solution.')
else:
print(f'There are {nb_of_solutions} solutions.')
网友评论