4 条题解

  • 0
    @ 2025-1-5 13:00:28
    如果你学习的只是最基本的枚举求素数,我建议你去学习素数的筛法
    
    • 0
      @ 2025-1-2 13:24:31
      希望我的思路能让你焕然一新
      #include<iostream>
      #include<cstring>
      using namespace std;
      const int N=7;
      int f[N];
      bool is_pre(int sum)
      {
      	if(sum<2)
      	{
      		return false;
      	}
      	for(int i=2;i<=sum/i;i++)
      	{
      		if(sum%i==0)
      		{
      			return false;
      		}
      	}
      	return true;
      }
      int main()
      {
      	int n,m,q=0,l=0,o=0;
      	cin>>m;
      	while(m--)
      	{   
      		l=0;
      		q=0;
      		o=0;
      		int t;
      		memset(f,0,sizeof(f));
      		cin>>n;
      		t=n;
      		while(t>0)
      		{
      			t/=10;
      			o++;
      		}
      		if(n==0||n==1)
      		{
      			cout<<"NO"<<endl;
      			continue;
      		}
      		if(is_pre(n))
      		{
      			while(n>0)
      			{
      			int t=n%10;
      			if(is_pre(t))
      			{
      			f[++q]=1;
      			}
      			n/=10;
      			}
      		}
      		f[5]=f[5]+f[4]+f[3]+f[2]+f[1];
      		if(f[5]==o)
      		{
      			l=1;
      		}	
      	if(l==1)
      	{
      		cout<<"YES"<<endl;
      	}else{
      		cout<<"NO"<<endl;
      	}
      	}
      	return 0;
      }
      来看看我的题解吧,需要注意的是不能在第二个while循环里面进行o++,原因你去拿含1的数试试就出来了,所以需要把o来进行求位数👀️
      
      • 0
        @ 2023-10-14 17:12:02

        #include <stdio.h> #include <math.h> int main() { int n,j; scanf("%d",&n); while (n>0) { int cont=1; int i; scanf("%d",&i); int k=sqrt(i); for (j=2;j<=k;j++) { if(i%j0) { cont=0; break; } } if(cont1&&i!=1) { int mask=1; int m=i; while(m>=10) { mask++; m/=10; } int iff=0; while(i>0) { int flag=1; int f=i%10; int s=sqrt(f); for (j=2;j<=s;j++) { if(f%j0) { flag=0; break; } } if(flag1&&f!=1) { iff++; } i/=10; } if(iff==mask) { printf("YES\n"); } else { printf("NO\n"); } } else { printf("NO\n"); }

        n--;
        }
        
        return 0;
        

        }

        • -1
          @ 2023-8-25 16:04:11

                 \ \ \ \ \ \ \ 解释见注释。

          #include <iostream>
          
          const int MAXN = 40010;
          
          bool isPrime[MAXN];
          
          int fillIsPrime(){//筛法判断素数
              isPrime[0] = false;
              isPrime[1] = false;
              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(){
              int n, x, r;
              fillIsPrime();
              scanf("%d", &n);
              for(int i = 1; i <= n; i++){
                  scanf("%d", &x);
                  if(isPrime[x]){
                      //当x本身是素数时进入while循环
                      r = x % 10;
                      while(isPrime[r]){
                          //检测每一位的数字是否是素数
                          x /= 10;
                          r = x % 10;
                      }
                      if((!r) && (!(x / 10))){
                          //当r=0时有两种情况:
                          //①每一位的数字都检测完毕,该数字是cry数;
                          //②检测的数有某一位是0,此时由于该0必不在最高位,故x/10一定不是0。
                          printf("YES\n");
                          continue;
                      }
                  }
                  printf("NO\n");
              }
              return 0;
          }
          
          • 1

          信息

          ID
          64
          时间
          1000ms
          内存
          128MiB
          难度
          8
          标签
          (无)
          递交数
          2124
          已通过
          249
          上传者