6 条题解

  • 0
    @ 2024-12-18 14:03:24

    //勉强能过[苦笑][苦笑]

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
    	int t,n,x,sum;
    	cin>>t;
    	int su[5000000];
    	while(t--)
    	{
    		cin>>n;
    		x = 0;
    		sum=0;
    		//用埃氏筛法筛选出素数
    		int aishi[n];
    		for(int i=1;i<=n;i++)
    		{
    			aishi[i]  =1;
    		}
    		for(int i=2;i<=sqrt(n);i++)
    		{
    			if(aishi[i])//如果是素数
    			{
    				for(int j=i*i;j<=n;j+=i)//筛掉倍数
    				{
    					aishi[j] = 0;
    				}
    			}
    		}
    		for(int i=2;i<=n;i++)//将所有素数存到数组里面去,再进行比较
    		{
    			if(aishi[i])
    			{
    				su[x++] = i;
    			}
    		}
    		for(int i=1;i<x;i+=2)
    		{
    			if(su[i+1]-su[i]==1||su[i+1]-su[i]==2)//说明是孪生素数
    			{
    				sum++;
    			}
    			if(su[i]-su[i-1]==1||su[i]-su[i-1]==2)
    			{
    				sum++;
    			}
    			if(su[i+1]-su[i-1]==2)
    			{
    				sum++;
    			}
    		}
    		cout<<sum<<endl;
    	}
    }
    
    • 0
      @ 2023-10-27 19:52:18
      #include<stdio.h>
      const int N=1e6+5;
      int box[N];
      void primes()
      {
      	box[0]=box[1]=1;
      	for(int i=2;i<N;i++)
      	{
      		if(!box[i])
      		{
      			for(int j=2;j*i<N;j++)
      			{
      				box[j*i]=1; 
      			}
      		}
      	}
      }
      int main()
      {
      	primes();
      	int n;
      	scanf("%d",&n);
      	while(n--)
      	{
      		int count=0;
      		int m;
      		scanf("%d",&m);
      		for(int i=1;i<=m;i++)
      		{
      			for(int j=i+1;j<i+3;j++)
      			{
                      if(j>m)
                      break;
      				if(!box[i]&&!box[j])
      				{
      //					printf("%d %d",i,j);
      					count++;
      				}
      			}
      		}
      		printf("%d\n",count);
      	}
      }
      
      • 0
        @ 2023-10-19 21:13:54
        #include<stdio.h>
        int box[1000000+5];
        const int N=1e6+5;
        void primes(){
             box[0]=1;
             box[1]=1;
             for(int i=2;i<=N;i++){
                if(box[i]==0){
                    for(long long j=i;j*i<=N;j++){
                        box[i*j]=1;
                    }
                }
             }
        }
        int main()
        {
            int n;
            scanf("%d",&n);
            primes();
            while(n--){
                int m;
                scanf("%d",&m);
                int cnt=0;
                for(int i=2;i<=m;i++){
                    if((box[i]==0&&box[i-2]==0)||(box[i]==0&&box[i-1]==0)){
                        cnt++;
                    }
                }
                printf("%d\n",cnt);
            }
            return 0;
        }
        
        • 0
          @ 2023-10-4 18:39:21
          刚学的热乎的素数筛
          ```#include<stdio.h>
          #include<math.h>
          const int n=1e6+5;
          int box[1000000];
          void primes();
          int main()
          {
          	int t;
          	scanf("%d",&t);
          	primes();
          	box[0]=1;
          	box[1]=1;
          	while(t--)
          	{
          		int cnt=0;
          		int m;
          		scanf("%d",&m);
          		for(int i=2;i<=m;i++)
          		{
          			if((box[i]==0&&box[i-1]==0)||(box[i]==0&&box[i-2]==0))
          			{
          				cnt++;
          			}
          		}
          		printf("%d\n",cnt);
          	}
          }
          
          void primes()
          {
          	for(int i=2;i<=n;i++)
          	{
          		if(box[i]==0)
          		{
          			for(int j=i+i;j<=n;j+=i)
          			{
          				box[j]=1;
          			}
          		}
          	}
          }
          ``````
          `````````
          
          • 0
            @ 2023-9-26 20:29:29

            素数筛选法: 开一个大数组,下标表示所有1 -- m之间的数。思路是把素数标记为1, 非素数标记为0; 因为偶数肯定不是素数,所以先标记所有偶数为0;还有一种方法是让下标从3开始,每次加2,就避过了偶数, 这样不用管偶数,更加省时。然后就是从3到根号下m之间,只要是素数,它的倍数肯定不是素数,标记为0. 这样,剩下的被标记为1的奇数就是要找的1 -- m之间的所有素数。 另外,总共进行n次测试,在测试之前标记完成,每次测试只要取其结果即可。

            int func(int);
            int main(void)
            {
            	int n, m, i, j, num;
            	int buf[100000]={0};//注意buf树状数组
            	scanf("%d", &n);
             
            	j=0;
            	buf[j++]=2;
            	/*把2到1000000的素数放到数组里*/
            	for(i=3; i<1000001; i += 2){
            		if(func(i) == 1){
            			buf[j++] = i;
            		}
            	}
             
            	while(n--){
            		num=0;
            		scanf("%d", &m);
            		for(i=1; i<=m; i++){
            			if(buf[i]>m){
            				break;
            			}
            			if((buf[i]-buf[i-1] == 1) || (buf[i]-buf[i-1] == 2)){
            				num++;
            			}
            		}
             
            		printf("%d\n", num);
            	}
             
            	return 0;
            }
             
            /*求是否为素数*/
            int func(int n)
            {	
            	if(n<2){
            		return -1;
            	}
            	int i;
            	for(i=2; i<=sqrt(n); i++){
            		if(n%i==0){
            			return 0;
            		}
            	}
            	return 1;
            }
            
            • 0
              @ 2023-8-26 21:27:29

                      \ \ \ \ \ \ \ 一次性统计完所有数字对应的孪生素数对数,这样就不需要每次重新循环统计。

              #include <cstdio>
              
              const int MAXN = 1000010;
              
              bool isPrime[MAXN];
              int twinPrimes[MAXN];
              
              int fillIsPrime(){
                  for(int i = 2; i <= MAXN; i++){
                      isPrime[i] = true;
                  }
                  for(int i = 2; i <= MAXN; i++){
                      if(isPrime[i]){
                          for(int j = 2 * i; j <= MAXN; j += i){
                              isPrime[j] = false;
                          }
                      }
                  }
                  return 0;
              }
              
              int main(){
                  fillIsPrime();
                  int n, m, rec = 1;
                  scanf("%d", &n);
                  twinPrimes[0] = 0;
                  twinPrimes[1] = 0;
                  twinPrimes[2] = 0;
                  for(int i = 3; i <= 1000010; i ++){
                      if(isPrime[i] && isPrime[i - 2]){
                          rec ++;
                      }
                      twinPrimes[i] = rec;
                  }
                  for(int i = 1; i <= n; i ++){
                      scanf("%d", &m);
                      printf("%d\n", twinPrimes[m]);
                  }
                  return 0;
              }
              
              • 1

              信息

              ID
              128
              时间
              3000ms
              内存
              128MiB
              难度
              8
              标签
              (无)
              递交数
              1638
              已通过
              222
              上传者