poj2909 || poj2262

#include <stdio.h>

#include <stdlib.h>

#include<math.h>

int isPri(int a, int b)

{

    int i;

    for(i=2; i <= sqrt(a); i++)

    {

        if(a%i == 0)

            return 0;

    }

    for(i=2; i <= sqrt(b); i++)

    {

        if(b%i == 0)

            return 0;

    }

    return 1;

}

int main()

{

    int n,flag,i,cout;

    while(scanf("%d",&n) != EOF && n)

    {

        cout=0;

        for(i=2; i< n/2+1; i++)

        {

            flag=isPri(i,n-i);

            if(flag == 1)

                cout++;

        }

        printf("%d\n",cout);

    }

    return 0;

}
View Code

for循环用于产生数对,用i<n/2+1或i<=n/2都可以避免产生重复的数对

在判断素数的时候采用小学生做法:从2到sqrt(n),i=2,i<=n(必须加=)

如果是2和3,根本不会经过循环

以后都用《埃拉托斯特尼筛法》打表

算法描述:小于2的不是素数,用一个数组a[10000],元素下标表示这个数,元素的值表示是否是素数,c++做法是,bool a[10000],将a[0]和a[1]赋成0,从2开始,2*2,2*3...

2*6...这些下标对应的元素值全改0,在此环境下再次寻找下一个素数,再一次,3*2,3*3,3*4...乘积整体小于10000

ar[10000]

ar[0]=0;

ar[1]=0;

for(i=2;i<10000;i++)

{

    ar[i]=1;

}

for(i=2;i<10000;i++)

{

    if(ar[i] == 1)

    {

        for(j=2;i*j<10000;j++)

        {

            ar[i*j] = 0;

        }

    }

}
View Code

下面的动态图很清楚:

http://blog.csdn.net/kingwolfofsky/article/details/7199758

你可能感兴趣的:(poj)