求超级素数的过程比较简单
主要是求路径
用pa[]随时记录前驱,就好了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h>
#include<math.h>
int prim[109];
int f[109];
int pa[109];
bool rprim[109];
int isprim(int a)
{
int t=sqrt(a*1.0);
int i;
for(i=2;i<=t;i++)
{
if(a%i==0)
return 0;
}
return 1;
}
int main()
{
int n;
scanf("%d",&n);
int i,add=1;
for(i=1;i<=n;i++)
f[i]=9999999;
f[0]=0;
for(i=2;i<=n;i++)
{
if(isprim(i)==1)
{
rprim[i]=1;
prim[add]=i;
add++;
}
}
int add1=1;
for(i=1;i<=add;i++)
{
if(rprim[i]==1)
{
prim[add1]=prim[i];
add1++;
}
}//选超级素数
int j;
for(j=0;j<n;j++)
{
for(i=1;i<add1&&prim[i]+j<=n;i++)
{
if(f[j]+1<f[j+prim[i]])
{
f[j+prim[i]]=f[j]+1;
pa[j+prim[i]]=j;
}
}
}
if(f[n]==9999999)
printf("0\n");
else
{
printf("%d\n",f[n]);
printf("%d",n-pa[n]);
n=pa[n];
while(n)
{
printf(" %d",n-pa[n]);
n=pa[n];
}
printf("\n");
}
}