poj-2739

来源:互联网 发布:淘宝商城电视机 编辑:程序博客网 时间:2024/06/05 20:52
#include "stdio.h"
#include "malloc.h"

int * getPrimeArray(int x, int * primeArraylength) {
    int * baseArray = (int *)malloc(x * sizeof(int));
    if (!baseArray) {
        return NULL;
    }
    for (int i = 0; i < x; i++) {
        baseArray[i] = 0;
    }

    baseArray[0] = -1;

    for (int i = 2; i <= x/2; i++) {
        for (int j = 2; j <= x/i; j++) {
            baseArray[i*j-1] = -1;
        }
    }

    int len = 0;
    for (int i = 0; i<x; i++) {
        if (!baseArray[i]) {
            len++;
        }
    }
    *primeArraylength = len;
    int *primeArray = (int *)malloc((len + 1) * sizeof(int));
    if (primeArray != NULL) {
        int j = 0;
        for (int i = 0; i<x; i++) {
            if (!baseArray[i]) {
                primeArray[j++] = i+1;
            }
        }
        primeArray[len] = -1;
    }
    return primeArray;
}



int getPrimeSumCombinationNum(int x) {
    int primeSumCombinationNum = 0;
    int length = 0;
    int *primeArray = getPrimeArray(x, &length);
    // for (int i = 0; i < length; i++) {
    //     printf(" %d", primeArray[i]);
    // }
    int begin = 0;
    int end = 0;
    int primeSum = primeArray[begin];

    while (begin <= end && end < length) {
        if (primeSum == x) {
            primeSumCombinationNum++;
            if (end > begin) {
                primeSum -= primeArray[begin];
                begin++;
            } else if (end == begin) {
                break;
            }
        } else if (primeSum > x) {
            if (end == begin) {
                break;
            }
            primeSum -= primeArray[begin++];
        } else if (primeSum < x) {
            if (end+1 >= length) {
                break;
            }
            primeSum += primeArray[++end];
        }
    }
    free(primeArray);
    primeArray = NULL;
    return primeSumCombinationNum;
}

int main() {
    while(1) {
        int primeSum = 0;
        scanf("%d", &primeSum);
        if (!primeSum) {
            break;
        } else {
            printf("%d\n", getPrimeSumCombinationNum(primeSum));
        }
    }

}


不难,就是繁琐,用了素数筛子过滤, 还有滑动窗口。

C++ Accept

低级错误: 1. malloc分配的是字节,一开始忘带*sizeof()了, 哎 语言用的太多就是容易忘事

                  2. 1不是素数


素数筛子和滑动窗口都是比较通用的模式.


ugly code.


0 0