#include <stdio.h>
#include <malloc.h>
#define MAX 1000000
bool prime[MAX] = {0};
void indicatePrime(bool * array, int length) {
for (int i = 2; i <= length/2; i++) {
for (int j = 2; j <= length/i; j++) {
array[i*j - 1] = 1;
}
}
}
void getPrimeSum(int sum, bool * indicateArray) {
for(int i = 3; i <= sum/2 ; i += 2) {
if ( (sum - i)%2 == 1 &&
indicateArray[i -1] == 0 &&
indicateArray[sum - i -1] == 0) {
printf("%d = %d + %d\n", sum, i, sum - i);
break;
}
}
}
void printPrimeSum(int num) {
getPrimeSum(num, prime);
}
int main() {
indicatePrime(prime, MAX);
int inputNum = 0;
while(1) {
scanf("%d", &inputNum);
if (inputNum) {
printPrimeSum(inputNum);
} else {
break;
}
}
#include <malloc.h>
#define MAX 1000000
bool prime[MAX] = {0};
void indicatePrime(bool * array, int length) {
for (int i = 2; i <= length/2; i++) {
for (int j = 2; j <= length/i; j++) {
array[i*j - 1] = 1;
}
}
}
void getPrimeSum(int sum, bool * indicateArray) {
for(int i = 3; i <= sum/2 ; i += 2) {
if ( (sum - i)%2 == 1 &&
indicateArray[i -1] == 0 &&
indicateArray[sum - i -1] == 0) {
printf("%d = %d + %d\n", sum, i, sum - i);
break;
}
}
}
void printPrimeSum(int num) {
getPrimeSum(num, prime);
}
int main() {
indicatePrime(prime, MAX);
int inputNum = 0;
while(1) {
scanf("%d", &inputNum);
if (inputNum) {
printPrimeSum(inputNum);
} else {
break;
}
}
}
题不难,素数筛子 + bitmap。
一开始没有直接求最大的素数表,而是来一个数求一次素数表,结果直接超时。
后来一开始就求了最大素数表,OK。
素数筛子要继续多练练,基本功能。
低级错误:
1. C数组语法忘了, int a[10] = {1} 只会把第一个设为1.
2. 因为数组从0开始的缘故,在以后再有类似的bitmap, 应该申请 size +1 的数组, 虽然浪费了一个, 但是在逻辑上更简洁,
否则,每次在真实数字和数组位置之间都要做 -1 转换,很容易遗漏出错。
自己学学数论还是有用的,起码能用一种正规的定量分析法了