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