n内的双胞胎对数c语言

想问一下这个程序有哪里错了呢?第一次用flag,这段是求相差2的素数在n内的对数,请各位神仙help me,thank you!


#include<stdio.h>
int main()
{
    int n,flag,i,m,k=0,sum=0,t,c;
    scanf("%d",&n);
    int a[10000];
    for(i=0;i<n;i++)
    {
        a[i]=i;
    }
    if(n==1)
    {
        printf("0");
    }
    else
    {
    for(m=2;m<n;m++)
    {
        if(a[i]%m==0)
        {
            k++;
        }
    }
    if(k!=0)
    {
        flag=1;
    }
    else
    {
        flag=0;
    }
    if(flag==1)
    {
        c=a[i];
        for(t=2;t<(c+2);t++)
        {
            if((c+2)%t==0)
            {
                sum++;
            }
        }
    }
            printf("%d",sum);
}
 return 0;
}

应该是判断素数和双胞胎素数那里错了,判断一个数是否为素数,可以使用2到这个数之间的数整除来判断是否为素数,如果可以整除说明不是素数,如果都不可以整除说明是素数,你上面的代码恰和这个相反,所以错了,然后还需要判断这个数+2是否为素数,两者都是素数才能判断出一个双胞胎数;

可以使用两个标记来判断双胞胎的数量,第一个标记用来标记用来判断当前的数是否为素数,第二个标记用来判断当前数+2是否为素数,如果两个标记都满足,则双胞胎的数量+1,修改如下:

参考链接:
C++:双胞胎数_五十六朵花的博客-CSDN博客_c++双胞胎数





#include<stdio.h>
int main()
{
    int n,flag,i,m,k=0,sum=0,t,c;
    scanf("%d",&n);
    int a[10000];
    
    for(i=0;i<n;i++)
    {
        a[i]=i;
    }
    
    if(n==1)
    {
        printf("0");
    }
    
    else
    {    
        int firstPrime,secondPrime;
        int twins=1;
        for(int i=2;i<=n;i++){
            
            firstPrime=1;//默认当前数为素数 
            
            for(int j=2;j<i;j++){
                if(i%j==0){  //如果当前数能被2到当前数之间的数整除,则当前数不是素数 
                    firstPrime=0;
                    break;
                }
            }
            
            if(firstPrime==1){  //如果当前数是素数,则判断当前数+2是否为素数 
            
                secondPrime=1;  //默认当前数+2为素数 
                
                for(int j=2;j<i+2;j++){                  
                    if((i+2)%j==0){  //如果当前数+2能被2到当前数+2之间的数整除,则说明当前数+2不是素数 
                        secondPrime=0;
                        break;
                    }
                }
                
                if((i+2)>n){  //当当前数大于输入的n,则第二个素数不满足要求,第二个素数标记置0 
                    secondPrime=0;
                }
                
                if(secondPrime==1){ //如果当前数+2为素数,则双胞胎数量+1,同时让i++,配合for循环的i++, 即下一次开始从当前数+2开始判断 
                    sum++;
                    i++;
                }
            }
            
        } 
        
//        
//        for(m=2;m<n;m++)
//        {
//            if(a[i]%m==0)
//            {
//                k++;
//            }
//        }
//        
//        
//        if(k!=0)
//        {
//            flag=1;
//        }
//        else
//        {
//            flag=0;
//        }
//        
//        if(flag==1)
//        {
//            c=a[i];
//            for(t=2;t<(c+2);t++)
//            {
//                if((c+2)%t==0)
//                {
//                    sum++;
//                }
//            }
//        }
        
        printf("%d",sum);
    }
 return 0;
}

img

else的逻辑完全不对
你可以先把n以内的素数个数求出,再除以2
所以应为:

#include<bits/stdc++.h>

using namespace std;

bool prime(int x) {
    if (x <= 1) {
        return 0;
    }
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    int n, sum = 0;
    scanf("%d", &n);
    if(n == 1) {
        printf("0");
    } else {
        for (int i = 2; i < n; i++) {
            if (prime(i)) {
                sum++;
            }
        }
        printf("%d", sum / 2);
    }
    return 0;
}

我把码风改成我自己的风格了,希望别介意~