Basicaly,当我运行代码时,如果我给它一个大数字(将它分成素数,但当我想以低数运行它不起作用)时,我看到的问题是,如果我给程序数字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);
}
答案 0 :(得分:1)
条件
for(k = 2; k <= n/2; k++)
负责。如果你想写一个数字作为不同素数的总和,对于小数,唯一的方法通常包括一个大于n/2
的素数 - 例如将8作为不同素数之和的唯一方法是8 = 3 + 5
。
如果你成功k <= n-2
,它就可以了。
如果您想允许多次使用相同的素数,例如8 = 2+2+2+2
或8 = 2+3+3
,则需要更改
if(st[h] <= st[h-1])
到
if(st[h] < st[h-1])
test
中的。
你应该跟踪到目前为止的总和,以避免最明显的低效率。 (并存储素数列表,而不是每次都检查每个数字。)