己知1000以内的质数集合A,如41=2+3+17+19,这样的质数可以拆分为两个或两个以上的不同的质数之和称为超质数,求A中最大的超质数?
#include <stdio.h>
#include <stdlib.h>
int s[200];
int prime[200];
int n;
struct node
{
int num[200];
int n;
};
node bit[200000];
bool isprime(int n)
{
if(n == 1) return false;
for(int i = 2; i <n; ++i)
{
if(n % i == 0)
return false;
}
return true;
}
void check(int k)
{
n = 0;
for(int i = 2; i < 1000; ++i)
{
if(isprime(i))
{
prime[n] = i;
++n;
}
}
s[0] = 2;
for(int i = 1; i < n; ++i)
{
s[i] = s[i-1] + prime[i];
}
memset(bit, 0, sizeof(node)*200000);
k = k > n ? n : k;
for(int i = 0; i < k; ++i)
{
if(bit[prime[i]].n == 0)
{
bit[prime[i]].n = 1;
bit[prime[i]].num[0] = prime[i];
}
for(int j = s[i-1]; j >= 2; --j)
{
if((bit[j].n > 1 && j != prime[i]) || (j != prime[i] && bit[j].n == 1) )
{
for(int k = 0; k < bit[j].n; ++k)
{
bit[j+prime[i]].num[k] = bit[j].num[k];
}
bit[j+prime[i]].n = bit[j].n+1;
bit[j+prime[i]].num[bit[j].n] = prime[i];
}
}
}
for(int m = 0; m <= 1000; ++m)
{
if(bit[m].n > 1 && isprime(m))
{
printf("%d = ", m);
for(int t = 0; t < bit[m].n-1; ++t)
{
printf("%d+", bit[m].num[t]);
}
if(bit[m].n - 1 >= 0)
{
printf("%d\n", bit[m].num[bit[m].n - 1]);
}
}
}
}
int main()
{
check(4);
return 0;
}