第五题:素数求和
一个数字,有时能表示成多个不同素数之和(至少2个不同素数)的形式,例如13可以表示成两个素数2、11之和。现在想要知道,一个数字到底有多少种用不同素数之和表示的方法。
这题要用到递归,不过不用打表,完美避过超纲。大致思路就是这个数减素数,再减素数,减到零就是成功。至于避过重复,可以通过控制素数的大小顺序。
#include<iostream>
#include<cmath>
#include<algorithm>
int sum;
using namespace std;
bool f(int m)
{
if (m == 1||m==0)return 0;
else
{
for (int i = 2; i <= sqrt(m); i++)
{
if (m%i == 0)return 0;
}
}
return 1;
}
void x(int m,int n)
{
if (m == 0)sum = sum + 1;
for (int i = n+1; i <=m; i++)
{
if (f(i))x(m - i, i);
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
int m;
cin >> m;
sum=0;
for (int p = 0; p < m; p++)
{
if (f(p))x(m-p, p);
}
cout << sum << endl;
}
return 0;
}
sum可以定义为全局变量,这样每次重新赋值就行,不用跑到函数里带来带去。