基本的に、コードを実行するときに、大きな数を指定すると機能します(素数に分割しますが、小さな数で実行したい場合は機能しません)私が見る問題は、プログラム番号8を指定すると画面には何も表示されません (私は 2+2+2+2 と関係があると思います)。 50 と書くと、行に 1 つの素数を繰り返さずにすべての可能性が表示されます。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define is_sol 2
#define is_pos 4
#define impos 0
int n, *st;
int prim (int n)
{
if ( n < 2 )
return impos;
else
if ( n != 2 && (n % 2) == 0)
return impos;
else
{ long i;
for(i = 3; i <=sqrt(1.0*n); i +=2)
if ( n % i == 0)
return impos;
}
return is_pos;
}
int test(int h)
{
int i;
if(!h)
return (st[h] < 2 ? impos : prim(st[h]));
if(st[h] <= st[h-1])
return impos;
int p = st[h];
if(!prim(p))
return impos;
int S = 0;
for(i = 0 ; i <= h ; i++)
S += st[i];
if(S == n)
return is_sol;
return (S < n ? is_pos : impos);
}
void print (int h)
{
int i;
for(i = 0 ; i <= h; i++)
printf("%d ", st[i]);
printf("\n");
}
void back(int h)
{
int k;
for(k = 2; k <= n/2; k++)
{
st[h] = k;
int rez = test(h);
if(rez == is_sol)
print(h);
else
{
if(rez == is_pos)
back(h+1);
}
}
}
int main()
{
printf( "Your number: ");
scanf("%d",&n);
st = (int*)malloc(sizeof(int)*(n/2));
back(0);
}