[51nod1106]质数检测

解题关键:

根据质数的定义,在判断一个数n是否是质数时,我们只要用1至n-1去除n,看看能否整除即可。但我们有更好的办法。先找一个数m,使m的平方大于n,再用<=m的质数去除n(n即为被除数),如果都不能整除,则n必然是质数。如我们要判断1993是不是质数,50*50>1993,那么我们只要用1993除以<50的质数看是否能整除,若不能即为质数.

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int n,t;
 5 int is_prime[100005],prime[100005];
 6 int sieve(int n){
 7     int p=0;
 8     fill(is_prime,is_prime+n+1,1);
 9     is_prime[0]=is_prime[1]=0;
10     for(int i=2;i<=n;i++){
11         if(is_prime[i]){
12             prime[p++]=i;
13             for(int j=2*i;j<=n;j+=i) is_prime[j]=0;
14         }
15     }
16     return p;
17 }
18 int main(){
19     cin>>t;
20     int p=sieve(1e5);
21     while(t--){
22         bool flag=false;
23         cin>>n;
24         if(n==2){
25             printf("yes\n");
26             continue;
27         }
28         for(int i=0;prime[i]*prime[i]<=n;i++){
29             if(n%prime[i]==0){
30                 flag=true;
31                 break;
32             }
33         }
34         if(flag) printf("no\n");
35         else printf("yes\n");
36     }
37     return 0;
38 }
时间: 2024-10-13 16:28:17

[51nod1106]质数检测的相关文章

51nod 1106 质数检测(miller rabin 素数测试.)

1106 质数检测 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出N个正整数,检测每个数是否为质数.如果是,输出"Yes",否则输出"No". Input 第1行:一个数N,表示正整数的数量.(1 <= N <= 1000) 第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9) Output 输出共N行,每行为 Yes 或 No. Input示例 5 2 3 4 5 6

(数论)51NOD 1106 质数检测

给出N个正整数,检测每个数是否为质数.如果是,输出"Yes",否则输出"No". Input 第1行:一个数N,表示正整数的数量.(1 <= N <= 1000) 第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9) Output 输出共N行,每行为 Yes 或 No. Input示例 5 2 3 4 5 6 Output示例 Yes Yes No Yes No 解:先使用欧拉筛法找到(int)sqrt(1e9)+1=31

51nod 1106 质数检测

题意:给定数判断是不是质数  大数据 题解: 判断是不是质数的同时判断<=n的质数个数并赋值 对于大数n的判断可以用:使m*m>n  然后看n%k==0(k为小于M的所以质数)  没有的话说明n为质数 AC代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int prime[100005],is_prime[100005]; 4 int n,p,t; 5 void seve() 6 { 7 memset(is_prime,

【51NOD-0】1106 质数检测

[算法]数学 #include<cstdio> #include<cmath> bool ok(int x) { int m=(int)sqrt(x+0.5); for(int i=2;i<=m;i++) { if(x%i==0)return 0; } return 1; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int x; scanf("%d&qu

【数论算法基础理论与实现】

[题目太正式了我还怎么写ヾ|≧_≦|"] [很简要] [参考文献:<算法导论>.白书.天宇哥哥课件] 1.基础 [除法定理]:对于任何整数a和正整数n,存在唯一整数q和r,满足0<=r<n且a=qn+r   WARN:C++中貌似不完全遵守这个东西,n认为是|n|,并且a为负时r可以为负 []  2.最大公约数 几条性质:gcd(a,b)=gcd(|a|,|b|) gcd(a,0)=|a| gcd(a,ka)=|a|   gcd(a,b)=gcd(b,a mod b) -

P1001 第K极值【tyvj】

1 /*========================================== 2 P1001 第K极值 3 内存限制 128MB 代码限制 64KB 4 描述 Description 5 给定一个长度为N(0<n<=10000)的序列,保证每一个序列中的数字a[i]是 6 小于maxlongint的非负整数 ,编程要求求出整个序列中第k大的数字减去 7 第k小的数字的值m,并判断m是否为质数.(0<k<=n) 8 输入格式 InputFormat 9 输入格式: 1

C语言1-100连加,求质数,算瑞年检测字母大小写,登录系统

#include <stdio.h> void test(){//1+2+3+4+.....+100 int a,b; a=0; b=0; for ( ; a<=100; a++) { b=b+a; printf("%d\n",b); } } void test1(){//输入一个数,看一下是不是质数 int c; printf("请输入一个大于10的数字:"); scanf("%d",&c); printf("

检测是否是质数

var a=prompt=("请输入一个数字:","") var flag=1//1表示是质数,0表示不是质数        for(var i=2;i<a;i++){                   if(a%i==0){                             flag=0;                             break;                    }        }        if(flag){

数论二&#183;Eular质数筛法

#1295 : 数论二·Eular质数筛法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上次我学会了如何检测一个数是否是质数.于是我又有了一个新的问题,我如何去快速得求解[1,N]这个区间内素数的个数呢? 小Hi:你自己有什么想法么? 小Ho:有!我一开始的想法是,自然我们已经知道了如何快速判定一个数是否是质数,那么我就直接将[1,N]之间每一个数判定一次,就可以得到结果.但我发现这个方法太笨了. 小Hi:确实呢,虽然我们已经通过快速素数检测将每