您的位置:首页 > 其它

1007. 素数对猜想 (20)

2016-04-02 18:58 387 查看
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。

输入格式:每个测试输入包含1个测试用例,给出正整数N。

输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:
20

输出样例:
4

第一种方法//提示段错误
段错误:

在编程中以下几类做法容易导致段错误,基本上是错误地使用指针引起的。

1)访问系统数据区,尤其是往系统保护的内存地址写数据最常见就是给一个指针以0地址。

2)内存越界(数组越界,变量类型不一致等): 访问到不属于你的内存区域。

#include <stdio.h>

#include<math.h>

#include <stdlib.h>

int isPrime(int n)

{

    int i;

    if(n>2&&n%2==0)

        return 0;

    for(i=3; i<=sqrt(n); i++)

    {

        if(n%i==0)

            return 0;

    }

    return 1;

}

int main()

{

    int n,i;

    int a[1000];

    int j=0;

    int cnt=0;

    scanf("%d",&n);

    for(i=3; i<=n; i++)

    {

        if(isPrime(i))

        {

            a[j]=i;

            j++;

        }

    }

    for(i=0; i<j; i++)

    {

        if(a[i+1]-a[i]==2)

            cnt++;

    }

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

    return 0;

}

第二种不采用数组

#include <stdio.h>

#include<math.h>

#include <stdlib.h>

int isPrime(int n)

{

    int i;

    if(n>2&&n%2==0)

        return 0;

    for(i=3; i<=sqrt(n); i++)

    {

        if(n%i==0)

            return 0;

    }

    return 1;

}

int main()

{

    int n,i;

    int cnt=0;

    scanf("%d",&n);

    int x,y;

    x = 2;

    y = 3;

    for(i=4; i<=n; i++)

    {

        if(isPrime(i))

        {

            x=y;y=i;

            if(y-x == 2)

                cnt++;

        }

    }

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

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: