编写一个函数,生成将n写为素数之和的所有可能性

时间:2013-01-30 21:38:21

标签: c++ c

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);
}

1 个答案:

答案 0 :(得分:1)

条件

for(k = 2; k <= n/2; k++)

负责。如果你想写一个数字作为不同素数的总和,对于小数,唯一的方法通常包括一个大于n/2的素数 - 例如将8作为不同素数之和的唯一方法是8 = 3 + 5

如果你成功k <= n-2,它就可以了。

如果您想允许多次使用相同的素数,例如8 = 2+2+2+28 = 2+3+3,则需要更改

if(st[h] <= st[h-1])

if(st[h] < st[h-1])
test中的

你应该跟踪到目前为止的总和,以避免最明显的低效率。 (并存储素数列表,而不是每次都检查每个数字。)