poj-2262

来源:互联网 发布:ucosii官方源码下载 编辑:程序博客网 时间:2024/05/18 03:34
#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;
        }
    }

}


题不难,素数筛子 + bitmap。

一开始没有直接求最大的素数表,而是来一个数求一次素数表,结果直接超时。

后来一开始就求了最大素数表,OK。

素数筛子要继续多练练,基本功能。

低级错误:

            1. C数组语法忘了, int a[10] = {1} 只会把第一个设为1.

            2. 因为数组从0开始的缘故,在以后再有类似的bitmap, 应该申请 size +1 的数组, 虽然浪费了一个, 但是在逻辑上更简洁,

               否则,每次在真实数字和数组位置之间都要做 -1 转换,很容易遗漏出错。

自己学学数论还是有用的,起码能用一种正规的定量分析法了

0 0
原创粉丝点击