LUCYprince 2025-03-26 21:37 采纳率: 50%
浏览 7

关于#c++#的问题:pta上的素数对猜想题用c++写了以后总是在“只有一对”这里丢2分,实在找不出问题

pta上的素数对猜想题用c++写了以后总是在“只有一对”这里丢2分,实在找不出问题。
题目如下:

img

pta评测如下:

img

代码如下:

#include<math.h>
#include<iostream>
using namespace std;
bool isprime(int n)
{
    if(n <= 1) return false;
    for (int i = 2;i <= sqrt(n);i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}
int main()
{
    int N;
    cin >> N;
    int res = 0;
    int a = 2;int b = 2;
    for (int i = 2;i < N;i++)
    {
        if (isprime(i))
        {
            a = b;
            b = i;
            if (b - a == 2) res++;
            
        }
    }
    cout<<res;
}

  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-03-26 22:20
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    我分析了你的代码和问题,发现主要问题出在素数对判断的逻辑上。当输入N=5时,你的代码会漏掉唯一的素数对(3,5)。以下是修正后的代码和解释:
    
    #include<math.h>
    #include<iostream>
    using namespace std;
    
    bool isprime(int n)
    {
        if(n <= 1) return false;
    #特别注意边界条件,包括n=2的情况
        for (int i = 2;i <= sqrt(n);i++)
        {
            if (n % i == 0) return false;
        }
        return true;
    }
    
    int main()
    {
        int N;
        cin >> N;
        int res = 0;
        int a = 2, b = 3;  #初始化改为2和3,确保能检测到第一对素数对
        for (int i = 4;i <= N;i++)  #从4开始检查,因为2和3已经初始化
        {
            if (isprime(i))
            {
                a = b;
                b = i;
                if (b - a == 2) res++;
            }
        }
        cout<<res;
        return 0;
    }
    

    主要修改点:

    1. 初始化时将a和b分别设为2和3,这样能确保检测到第一对素数对(3,5)
    2. 循环从4开始,因为2和3已经初始化
    3. 循环条件改为i <= N,确保能检查到N本身是否为素数
    4. 添加了return 0,虽然不影响结果但更规范

    这个修改解决了当N=5时漏掉(3,5)素数对的问题,应该能通过PTA的所有测试用例。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月26日