素数分解 (2016_6)

来源:互联网 发布:淘宝卖家积分等级:皇冠 编辑:程序博客网 时间:2024/06/17 16:01

素数分解 (2016_6)
素数,又称质数,是指除 1和其自身之外,没有其他约数的正整数。例如 2、3、5、13 都是质 数,而 4、9、12、18 则不是。 虽然素数不能分解成除 1和其自身之外整数的乘积,但却可以分解成更多素数的和。你需要编程 求出一个正整数最多能分解成多少个互不相同的素数的和。 例如,21 = 2 + 19 是 21的合法分解方法。21 = 2 + 3 + 5 + 11 则是分解为最多素数的方法。
输入 n (10 ≤ n ≤ 200)。
输出 n 最多能分解成多少个不同的素数的和。
输入 输出:
样例1, 21 4
样例2, 128 9

这是我的方法

#include<iostream>#include<cmath>using namespace std;int num[50];int n;int index=0;int maxtotal=-1;bool issu(int m)//判断素数{    if (m==2)        return true;    else if (m%2==0)        return false;    else    {        int k=sqrt(m)+1;        for (int i=2;i<=k;i++)        {            if (m%i==0)                return false;        }    }    return true;}void  fun(int k,int sum,int total)//k为当前下标,sum为总和,total为使用的数字的个数{   if (sum==n)   {       if (total>maxtotal)//更新total       {           maxtotal=total;       }       return ;   }   if (sum>n||k>=index)//如果sum超过n,或者下标大于素数个数结束   {       return ;   }    fun(k+1,sum+num[k],total+1);    fun(k+1,sum,total);}int main(){    cin>>n;    for (int i=2;i<=n;i++)    {        if (issu(i))//如果是素数,将其存进num数组        {            num[index++]=i;        }    }    fun(0,0,0);    cout<<maxtotal;    return 0;}

但我老师给出了更牛逼的做法。我老师的做法,利用哥德巴赫猜想。

#include<iostream>#include<cmath>using namespace std;int num[50];int n;int index=0;bool issu(int m)//判断素数{    if (m==2)        return true;    else if (m%2==0)        return false;    else    {        int k=sqrt(m)+1;        for (int i=2;i<=k;i++)        {            if (m%i==0)                return false;        }    }    return true;}int main(){    cin>>n;    int sum=01,i,j;    for (int i=2;i<=200;i++)    {        if (issu(i))//如果是素数,将其存进num数组        {            num[index++]=i;        }    }    //_______________________________    for ( i=0;sum<n;i++)//将素数逐个累加        sum+=num[i];    if (sum==n)//如果正好等于n,即为正解    {        cout<<i;        return 0;    }    for ( j=2,sum-=n;j<=sqrt(sum);j++)//当sum>n时,需要sum-=n,    {        if (sum%j==0)            break;    }        //此时sum不是质数就是合数    if (j>sqrt(sum))//如果是质数将个数减1        i--;    else//如果是合数,则减2        i-=2;    cout<<i;    return 0;}
0 0
原创粉丝点击