鱼C论坛

 找回密码
 立即注册
查看: 2192|回复: 8

[技术交流] Python: 每日一题 110

[复制链接]
发表于 2017-10-7 15:56:23 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本题是华为面试题,看看做得出来么?用python应该很容易解答。

题目:
输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。
1 2 3 4 5 6 7 8 9 = X
比如:
12-34+5-67+89 = 5
1+23+4-5+6-7-8-9 = 5
请编写程序,统计满足输入整数的所有整数个数。
输入:       正整数,等式右边的数字
输出:       使该等式成立的个数
样例输入:5
样例输出:21

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-10-7 16:38:10 From FishC Mobile | 显示全部楼层
这题给点思路的提示吧:
1,2,3,4,5,6,7,8,9中间有8个空,在这8个空之间塞入“+”,“-”和“”,然后把它们连成字符串,如果eval()这个字符串能==x的话,就是我们要找的一个解了。可以利用itertools模块生成排列组合。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-8 00:20:59 | 显示全部楼层
  1. from itertools import product
  2. def f(n):
  3.     d = {'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
  4.     s = []
  5.     s1 = []
  6.     for i in product('12345678','+- '):
  7.         s.append(''.join(i))
  8.     for a in range(3):
  9.         for b in range(3,6):
  10.             for c in range(6,9):
  11.                 for e in range(9,12):
  12.                     for o in range(12,15):
  13.                         for k in range(15, 18):
  14.                             for i in range(18,21):
  15.                                 for j in range(21,24):
  16.                                     s1.append(s[a].rstrip()+s[b].rstrip()+s[c].rstrip()+s[e].rstrip()+s[o].rstrip()+s[k].rstrip()+s[i].rstrip()+s[j].rstrip()+'9')
  17.     s2 = 0
  18.     for i in s1:
  19.         if eval(i,d) == n:
  20.             s2 += 1
  21.     return s2

  22. print(f(5))
复制代码


按你的思路真的很简单,但是中间那段长的循环目前我优化不了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-8 06:44:37 From FishC Mobile | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-10-8 06:47 编辑
bush牛 发表于 2017-10-8 00:20
按你的思路真的很简单,但是中间那段长的循环目前我优化不了。。。


不用写得那么复杂
  1. def calc(x):
  2.   import itertools as it
  3.   c = 0
  4.   num = [str(i) for i in range(1,10)]
  5.   for each in it.product(('+','-',''),repeat=8):
  6.     s = ''
  7.     for i in range(8):
  8.       s+=num[i]+each[i]
  9.     s+=num[8]
  10.     if eval(s)==x:
  11.       c+=1
  12.       print(s)
  13.   return c
  14. print(calc(5))
复制代码

1+2+3+4-5+6-7-8+9
1+2+3+4-5-6+7+8-9
1+2+3-4+5+6-7+8-9
1+2+34-56+7+8+9
1+2-3+4+5+6+7-8-9
1+2-3-4+5-6-7+8+9
1+2-3-4-5+6+7-8+9
1+2-3-45+67-8-9
1+23+4-5+6-7-8-9
1-2+3+4-5-6-7+8+9
1-2+3-4+5-6+7-8+9
1-2+3-4-5+6+7+8-9
1-2-3+4+5+6-7-8+9
1-2-3+4+5-6+7+8-9
1-2-3-4-5-6+7+8+9
1-2-3-4-56+78-9
1-2-34-56+7+89
1-23+4+5-6+7+8+9
1-23+45+6-7-8-9
1-23-4-56+78+9
12-34+5-67+89
21

#[QPython] Press enter to exit
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-8 10:03:27 | 显示全部楼层
本帖最后由 SixPy 于 2017-10-8 10:11 编辑
  1. from itertools import product

  2. def calc(x=5):
  3.     opr = b'abcdefghi'
  4.     exp = ''.join(''.join(x)for x in zip('123456789', opr.decode()))[:-1]
  5.     ls = [e for e in(exp.translate(dict(zip(opr,op)))
  6.             for op in product((ord('+'),ord('-'),None),repeat=8))
  7.             if eval(e)==x]
  8.     return len(ls),ls

  9. print(calc())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-8 21:07:23 | 显示全部楼层
如果1左边不可以加负号的话,那就是1-9间8个空位,
对应 加、减、空字符串 3种情况
  1. import itertools as it

  2. def fun(n):
  3.     num = '23456789'
  4.     sign = ['+','-',""]
  5.     result = 0
  6.     for i in it.product(sign, repeat=8):
  7.         temp = "".join(k for j in zip(i, num) for k in j)
  8.         if eval('1'+temp) == n:
  9.             result += 1
  10.     return result
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-9 16:32:52 | 显示全部楼层
  1. x = int(input('请输入一个正整数x:'))
  2. import itertools
  3. L = ['1','2','3','4','5','6','7','8','9']
  4. count = 0
  5. for tmp in itertools.product(['+','-',''],repeat = 8):
  6.     s = ''
  7.     for i in range(len(L)):
  8.         s += L[i]
  9.         if i != 8:
  10.             s += tmp[i]
  11.     if eval(s) == x:
  12.         count += 1
  13. print(count)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 15:16:02 | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-1-16 15:18 编辑
  1. #  自己做就做成下面这样了。对Python的标准库学习太少了。itertools的product都不知道。
  2. def f(n):
  3.     count = 0
  4.     symbols = ['+', '-', '']
  5.     numbers = '123456789'
  6.     for a in symbols:
  7.         for b in symbols:
  8.             for c in symbols:
  9.                 for d in symbols:
  10.                     for e in symbols:
  11.                         for f in symbols:
  12.                             for g in symbols:
  13.                                 for h in symbols:
  14.                                     x = [a,b,c,d,e,f,g,h]
  15.                                     left = ''
  16.                                     for i in range(8):
  17.                                         left += (numbers[i] + x[i])
  18.                                     left += '9'
  19.                                     y = eval(left)
  20.                                     if y == n:
  21.                                         count += 1
  22.                                         print(left, '=', y)
  23.     print(count)

  24. f(5)
复制代码
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-19 16:16:39 | 显示全部楼层
  1. def fun110(x):
  2.     num = '123456789'
  3.     list_x = []
  4.     for a in ['+','-','']:
  5.         for b in ['+','-','']:
  6.             for c in ['+','-','']:
  7.                 for d in ['+','-','']:
  8.                     for e in ['+','-','']:
  9.                         for f in ['+','-','']:
  10.                             for g in ['+','-','']:
  11.                                 for h in ['+','-','']:
  12.                                     list_x.append([a,b,c,d,e,f,g,h])
  13.     counter = 0
  14.     for i in list_x:
  15.         result_list = []
  16.         for j in range(9):
  17.             if j == 8:
  18.                 result_list.append(num[j])
  19.             else:
  20.                 result_list.append(num[j])
  21.                 result_list.append(i[j])
  22.         if eval(''.join(result_list)) == x:
  23.             counter += 1
  24.     return counter
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 05:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表