素数对猜想测试点问题

PTA 1007素数对猜想

img

代码

#include
#include
int FindSu(int n) {
int i;
int flag = 0 ;
for (i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
flag = 1; //flag=1表示不是素数
}
if ((i > n / 2) && (n != 1)) flag = 0;
}
return flag;
}
int main() {
int n;
int times = 0;
scanf_s("%d", &n);
int i;
for (i = 3 ; i <= n; i++) {
if (FindSu(i) == 0) {
if (FindSu(i) == FindSu(i + 2)) {
times++;
i++;
}
}
}
printf("%d", times);
return 0;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

思路:不采用先计算素数表,采用一边判断x是不是素数,一边判断x+2是不是素数。如果两者都是素数,则计数器+1。
我已经解决的问题:"不超过“和”不超时“。
我在网上找过了其他c语言代码,自己输入随机数进行对比,答案结果一致。

我想要达到的结果

测试点134。
感谢帮助!

修改见注释,供参考:

#include<stdio.h>
//#include<math.h> 修改
int FindSu(int n) {
    int i;
    int flag = 0 ;
    if (n <= 1) return 1;  //修改
    for (i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            flag = 1; //flag=1表示不是素数
            break;
        }
        //if ((i > n / 2) && (n != 1)) flag = 0; 修改
    }
    return flag;
}
int main() {
    int n;
    int times = 0;
    scanf("%d", &n);
    int i;
    for (i = 3 ; i < n - 1; i++) {  //for (i = 3 ; i <= n; i++) 修改
        if (FindSu(i) == 0 && FindSu(i + 2) == 0) {
           //if (FindSu(i) == FindSu(i + 2)) {  修改
               times++;
               //i++;    修改
           //}           修改
        }
    }
    printf("%d", times);
    return 0;
}

收到你的邀请,很荣幸。我给你个简单点的方便理解的:


#include <stdio.h>

int sushu(int n)
{
    if(n<=3)
        return n>1;

    for(int i = 2; i * i <= n; i++)
       if(n%i == 0)
           return 0;

    return 1;
}

int main()
{
    int n = 0;
    printf("input n: ");
    scanf("%d", &n);

    int result = 0;

    for (int i = 3; i < n - 1; i += 2) { //从3 开始的所有奇数,偶数没有任何必要取计算
        if (sushu(i) && sushu(i + 2)) {
            result++;
        }
    }
    
    printf("result: %d\n", result);
    
    return 0;
}

本人思路;
建议利用while循环内嵌for循环先得出全部素数,然后再把全部素数放到一个数组,然后再判断是不是数组对。