模拟/sgu113 Nearly prime numbers
题意
给出一个数n,如果n能分解成两个质数相乘,则输出Yes,否则输出No
多case.
分析
首先先用筛法预处理出1~40000以内的质数,共tot个
然后for (1~tot)循环,如果n能被prime[i]整除,并且除数也是质数,则为Yes,否则为No
Accepted Code
1 /* 2 PROBLEM:sgu113 3 AUTHER:Rinyo 4 MEMO:模拟 质数 5 */ 6 7 #include<cstdio> 8 int prime[40030]; 9 int isprime(int x) 10 { 11 if (x<2) return 0; 12 for (int i=2;i*i<=x;i++) 13 if (x%i==0) return 0; 14 return 1; 15 } 16 int main() 17 { 18 int num; 19 scanf("%d",&num); 20 int tot=0; 21 for (int i=2;i<=40000;i++) 22 if (isprime(i)) prime[tot++]=i; 23 while (num--) 24 { 25 int n; 26 scanf("%d",&n); 27 int flag=0; 28 for (int i=0;i<tot;i++) 29 if (n%prime[i]==0 && isprime(n/prime[i])) 30 { 31 flag=1; 32 printf("Yes\n"); 33 break; 34 } 35 if (!flag) printf("No\n"); 36 } 37 return 0; 38 }