5 条题解

  • 0
    @ 2025-10-14 19:28:28

    [#include <stdio.h> #include <stdbool.h>

    // 判断一个数是否为质数 bool isPrime(int n) { if (n <= 1) return false; if (n == 2) return true; if (n % 2 == 0) return false;

    for (int i = 3; i * i <= n; i += 2) {
        if (n % i == 0) return false;
    }
    return true;
    

    }

    // 判断一个数是否为cry数 bool isCryNumber(int n) { // 首先判断数字本身是否为质数 if (!isPrime(n)) return false;

    // 然后判断每一位数字是否为质数
    int temp = n;
    while (temp > 0) {
        int digit = temp % 10;
        // 检查每一位数字是否为质数
        if (digit != 2 && digit != 3 && digit != 5 && digit != 7) {
            return false;
        }
        temp /= 10;
    }
    return true;
    

    }

    int main() { int T; scanf("%d", &T);

    while (T--) {
        int n;
        scanf("%d", &n);
        
        if (isCryNumber(n)) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
    
    return 0;
    

    } ](https://)

    • 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
            标签
            (无)
            递交数
            2256
            已通过
            275
            上传者