Project Euler:Product-sum numbers (problem 88) C++

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?

求积和数的一道题目,大多都是递归。

继续推导可以发现,f(k)的取值在[k,2k]之间。

可以推出,k=num-因子和+(num-因子和)*1;

那好了,就是写个<set>去重,写出递归函数就可以。

#include<iostream>
#include<set>
using namespace std;
set<int> Q;
set<int>::iterator it;
bool re(int x,int y,int z);
int getn(int n)
{
    for(int k=n+1;k<=2*n;k++)    //k的取值 k---2k
    {
        if(re(k,k,n))   //num, sum, digit
            return k;
    }
}
bool re(int x,int y,int z)
{
    //cout<<x<<" "<<y<<" "<<z<<endl;
    if(y<z)
        return 0;
    if(x==1)
        return y==z;
    if(z==1)
        return x==y;
    for(int i=2;i<=x;i++)
    {
        if(x%i==0)
        {
      //      cout<<"  i="<<i<<endl;
            if(re(x/i,y-i,z-1))
                return 1;
        }

    }
    return 0;
}
int main()
{
    int n;
    long long s=0;
    for(int i=2;i<=12000;i++)
    {
        n=getn(i);
        Q.insert(n);                 //此处可以直接判断 insert()的返回值,求和。
    }
    for(it=Q.begin();it!=Q.end();it++)
    {
        s+=*it;
    }
    cout<<s<<endl;
}

//execution time : 21.385 s

  

 

posted @ 2017-08-17 19:51  会飞的雅蠛蝶  阅读(231)  评论(0编辑  收藏  举报