zoukankan      html  css  js  c++  java
  • 51nod 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
    
    Output示例
    Yes
    Yes
    No
    Yes
    No


    素数测试,此处提供两种代码

    1、素数测试:


    #include<cstdlib>
    #include<cstdio>
    int modularExponent(int a, int b, int n) {
    	int ret = 1;
    	for (; b; b >>= 1, a = (int) ((long long) a * a % n)) {
    		if (b & 1) {
    			ret = (int) ((long long) ret * a % n);
    		}
    	}
    	return ret;
    }
    bool millerRabin(int n,int a) {
    	if (n == 1 || (n != 2 && !(n % 2)) || (n != 3 && !(n % 3)) || (n != 5 && !(n % 5)) || (n != 7 && !(n % 7))) {
    		return false;
    	}
    	int r = 0, s = n - 1, j;
    	if(!(n%a)) return false;
    	while(!(s&1)){ s >>= 1; r++; }
    	long long k = modularExponent(a, s, n);
    	if(k == 1) return true;
    	for(j = 0; j < r; j++, k = k * k % n)
    	    if(k == n - 1) return true;
    	return false;
    }
    bool miller_Rabin(int n)//
    {
    	int a[]={2,3,5,7},i;//能通过测试的最小素数为 3215031751(此数超int)
    	for(i=0;i<4;i++){
    		if(!millerRabin(n,a[i]))return false;
    	}
    	return true;
    }
    int main()
    {
    	int n,x;
    	scanf("%d",&n);
    	while(n--){
    		scanf("%d",&x);
    		printf("%s
    ",miller_Rabin(x)?"Yes":"No");
    	}
    	return 0;
    }


    2、大神代码


    #include <stdio.h>
    #include <math.h>
    
    #define  MAXP 31627
    
    char  flag[MAXP+1];
    int   prime[4000];
    int   count = 0;
    
    void  init_ptbl() {
            int  i, k, m;
            prime[count++] = 2;
            for( i = 3; i <= MAXP / 2; i += 2 ) {
                    if( flag[i] == 1 ) continue;
                    for( k = 2; ( m = i * k ) <= MAXP; ++k ) flag[m] = 1;
            }
            for( i = 3; i <= MAXP; i += 2 ) if( flag[i] == 0 ) prime[count++] = i;
    }
    
    int main() {
            int n, x, i, e;
            init_ptbl();
    
      scanf( "%d", &n );
      while( n-- ) {
        scanf( "%d", &x );
        if( ( x & 1 ) == 0 ) { puts( x == 2 ? "Yes" : "No" ); continue; }
        e = (int)sqrt( x ) + 1;
        for( i = 1; prime[i] <= e; ++i ) if( x % prime[i] == 0 ) break;
        puts( prime[i] <= e ? "No" : "Yes" );
      }
      return 0;
    }








  • 相关阅读:
    FCOS及其和Faster R-CNN的区别
    CornerNet: Detecting Objects as Paired Keypoints
    神经网络不收敛的原因
    交叉熵损失函数
    Placeholder_2:0 is both fed and fetched
    使用Lambda解决_inbound_nodes错误
    Python对Dict排序
    对Faster R-CNN的理解(3)
    Keras运行速度越来越慢的问题
    深度卷积网络(DCNN)和人类识别物体方法的不同
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387128.html
Copyright © 2011-2022 走看看