四川 网站建设,番禺网站建设,广西建设厅官网证件查询,盐城seo推广文章目录题目相关链接算法代码代码可优化的点喜欢这种搞逻辑的题目。据说chatGPT暂时还不会写hhh。水平有限#xff0c;我自己花了两个小时才实现#xff0c;不过解决问题的过程还是很快乐的。题目
一天#xff0c;鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了…
文章目录题目相关链接算法代码代码可优化的点喜欢这种搞逻辑的题目。据说chatGPT暂时还不会写hhh。水平有限我自己花了两个小时才实现不过解决问题的过程还是很快乐的。题目
一天鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓把这两个数的乘积告诉了孙膑但孙膑和庞涓彼此不知到对方得到的数。 第二天庞涓很有自信的对孙膑说虽然我不知到这两个数是什麽但我知道你一定也不知道。 随后孙膑说那我知道了。 过一会儿庞涓说那我也知道了。 这两个数是多少 答案413
相关链接
针对题目的解题思路和逻辑分析都已经有了这里引用一下。 我没有仔细看所以也和我代码的思路可能存在出入。 https://baike.baidu.com/item/%E9%AC%BC%E8%B0%B7%E5%AD%90%E9%97%AE%E5%BE%92/7164919 https://www.cnblogs.com/devymex/p/3329635.html
算法代码
import numpy as npLOWER_BOUND 2
UPPER_BOUND 99def sum_decompose(num):# decompose a number into two numbers in [2,99]list []for i in range(LOWER_BOUND, (num-1)//21):if (num-i) UPPER_BOUND:list.append((i, num-i))return listdef product_decompose(num):list []for i in range(LOWER_BOUND, UPPER_BOUND):if np.mod(num, i) 0 and (num//i UPPER_BOUND):list.append((i, num//i))if i*i num:breakreturn list# print(fsum_decompose:{sum_decompose(105)})
# print(fproduct_decompose:{product_decompose(105)})ans_sum np.ones(200) # Elimination method
for i in range(LOWER_BOUND, UPPER_BOUND):for j in range(i1, UPPER_BOUND1):num_Pan ijnum_Sun i*jif ans_sum[num_Pan] 0:continue# Pan dont know:list sum_decompose(num_Pan)if len(list) 1:ans_sum[num_Pan] 0continue# Pan know Sun dont know:for pair in list:num1, num2 pairproduct num1*num2result product_decompose(product)if len(result) 1:ans_sum[num_Pan] 0continue# After that, Sun know:
ans_product np.zeros(UPPER_BOUND*UPPER_BOUND, dtypeint)
for i in range(2*LOWER_BOUND1, UPPER_BOUND1):if ans_sum[i] 1:list sum_decompose(i)for pair in list:num1, num2 pairans_product[num1*num2] 1# Only when the solution is uniquethe condition can be satisfied
for i in range(2*LOWER_BOUND1, UPPER_BOUND1):if ans_sum[i] 1:list sum_decompose(i)pair_num len(list)# print(f{i}:{len(list)})for pair in list:# print(ans_product[num1*num2])num1, num2 pairif ans_product[num1*num2] 2:pair_num - 1if pair_num 1:# print(f\n#########\nans:{i}\n#########)for pair in list:num1, num2 pairif ans_product[num1*num2] 1:print(fnum1{num1},num2{num2})
代码可优化的点
随手一写基本可以体现我的编程/调试习惯。 但是写代码就要考虑代码质量。 批判性地对自己的代码提几点意见
sum_decompose 函数的计算复杂度不低且被重复调用可以额外开辟空间记录。ans_product 、ans_sum 记录的效率偏低用字典可以节约空间。变量命名偏随意函数复用率较低。入口最好是if __name__ __main__:。函数输入输出的变量类型未定义。计算过程、打印结果 混合在了一起未作明显区分。
随手写的代码计算得到正确答案413后我就不想继续修改了。 当UPPERBOUND变得更大变成了500运行了一下求解速度明显变慢此时多了一组解461) 。 直觉地看解的数量可能没有限制随着可选数的上界增加而缓慢增加。 如果代码还有其他问题欢迎大家指出。