View difference between Paste ID: G92H7k78 and
SHOW: | | - or go back to the newest paste.
1-
1+
#include <stdio.h>
2
#include <stdlib.h>
3
4
#define MAX 1000
5
6
int prevprime[MAX];
7
8
int isprime(int n) {
9
    int i;
10
    if (n < 2) return 0;
11
    for(i = 2; i*i <= n; i++) {
12
        if (n % i == 0) return 0;
13
    }
14
    return 1;
15
}
16
void init_prevprime() {
17
    int i;
18
    prevprime[0] = -1;
19
    for(i = 1; i < MAX; i++) {
20
        prevprime[i] = isprime(i-1) ? i-1 : prevprime[i-1];
21
    }
22
}
23
void findsums(int n) {
24
    int seq[MAX/2];
25
    int nseq = 0;
26
    int p = prevprime[n+1];
27
    int nsols = 0;
28
    int i;
29
    for(;;) {
30
        n -= p;
31
        seq[nseq++] = p;
32
        if (n == 0) {
33
            printf("%d:",++nsols);
34
            for(i = 0; i < nseq; i++) {
35
                printf(" %d", seq[i]);
36
            }
37
            putchar('\n');
38
        }
39
        if (n <= 0) {
40
            p = -1;
41
        }
42
        while (p < 0 && nseq > 0) {
43
            p = seq[--nseq];
44
            n += p;
45
            p = prevprime[p];
46
        }
47
        if (p < 0 && nseq <= 0) {
48
            break;
49
        }
50
    }
51
    printf("Total %d sums for %d\n", nsols, n);
52
}
53
54
int main(int argc, char **argv) {
55
    (void)argc;
56
    init_prevprime();
57
    while(argv[1]) {
58
        int n = atoi(argv[1]);
59
        printf("Sums for %d:\n", n);
60
        findsums(n);
61
        argv++;
62
    }
63
    return 0;
64
}