Project Euler:Problem 88 Product-sum numbers
Posted claireyuancy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Project Euler:Problem 88 Product-sum numbers相关的知识,希望对你有一定的参考价值。
A natural number, N, that can be written as the sum and product of a given set of at least two natural numbers, {a1, a2, ... , ak} is called a product-sum number: N = a1 + a2 + ... + ak = a1 × a2 × ... × ak.
For example, 6 = 1 + 2 + 3 = 1 × 2 × 3.
For a given set of size, k, we shall call the smallest N with this property a minimal product-sum number. The minimal product-sum numbers for sets of size, k = 2, 3, 4, 5, and 6 are as follows.
k=2: 4 = 2 × 2 = 2 + 2
k=3: 6 = 1 × 2 × 3 = 1 + 2 + 3
k=4: 8 = 1 × 1 × 2 × 4 = 1 + 1 + 2 + 4
k=5: 8 = 1 × 1 × 2 × 2 × 2 = 1 + 1 + 2 + 2 + 2
k=6: 12 = 1 × 1 × 1 × 1 × 2 × 6 = 1 + 1 + 1 + 1 + 2 + 6
Hence for 2≤k≤6, the sum of all the minimal product-sum numbers is 4+6+8+12 = 30; note that 8 is only counted once in the sum.
In fact, as the complete set of minimal product-sum numbers for 2≤k≤12 is {4, 6, 8, 12, 15, 16}, the sum is 61.
What is the sum of all the minimal product-sum numbers for 2≤k≤12000?
n[k]表示minimal product-sum numbers for size=k
n[k]的上界为2*k,由于2*k总是能分解成2*k,然后2*k=k+2+(1)*(k-2)
显然n[k]的下界为k
对于一个数num 因式分解后因子个数为product 这些因子的和为sump
则须要加入的1的个数为num-sump,所以size k=num-sump+product
maxk = 12000 n=[2*maxk for i in range(maxk)] def getpsn(num,sump,product,start): #print(num,' ',sump,' ',product) k = num - sump + product if k < maxk: if num < n[k]: n[k] = num for i in range(start,maxk//num * 2): #控制num<=2*maxk getpsn(num * i,sump + i,product + 1,i) getpsn(1,1,1,2) ans=sum(set(n[2:])) print(ans)
以上是关于Project Euler:Problem 88 Product-sum numbers的主要内容,如果未能解决你的问题,请参考以下文章
Project Euler:Problem 89 Roman numerals
Project Euler :Problem 54 Poker hands
Project Euler:Problem 77 Prime summations