zoukankan      html  css  js  c++  java
  • 素数问题

            素数即只能被自身和1整除的大于1的正整数。

            第一个问题是如何判断n是否是素数,可以用所有大于1小于其本身的整数去试着整除该数,若该区间内存在某个数能整除该数则该数不是素数。但其实不需测试到n-1,只需测试到  sqrt(n)+1 即可。原因如下:

            假设n存在大于等于sqrt(n)的因数y,则z = n/y必同时为n的因数,且其值小于等于 sqrt(n) 否则 z*y>n

    素数判定

    题目描述

    给定一个数n,要求判断其是否为素数(0,1,负数都是非素数)。

    输入描述:

    测试数据有多组,每组输入一个数n。

    输出描述:

    对于每组输入,若是素数则输出yes,否则输入no。
    示例1

    输入

    13
    

    输出

    yes

     1 #include<stdio.h>
     2 #include<math.h>
     3 
     4 int main()
     5 {
     6     int x,y;
     7     int i;
     8     int flag;
     9     while( scanf("%d",&x)!=EOF)
    10     {
    11         flag = 1;
    12         if( x<=1 )  flag = 0;   //小于等于1必不是素数
    13 
    14         else
    15         {
    16             y = (int)sqrt(x)+1;  //开方有可能是小数,强制转换
    17 
    18             for( i=2; i<y; i++)
    19             {
    20                 //这里注意素数从2开始
    21                 if( x%i==0)
    22                 {
    23                     flag = 0;
    24                     break;
    25                 }
    26             }
    27         }
    28         if( !flag)  printf("no
    ");
    29         else printf("yes
    ");
    30 
    31     }
    32     return 0;
    33 }

           第二个问题是枚举出一个范围的所有素数。

    素数

    题目描述

    输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。

    输入描述:

    输入有多组数据。
    每组一行,输入n。

    输出描述:

    输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
    示例1

    输入

    100
    

    输出

    11 31 41 61 71
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int main()
     5 {
     6     int n,x;
     7     int ans[2000];  //存放目标素数
     8     int index;
     9     int i;
    10     int isPrime,flag;
    11     while(scanf("%d",&n)!=EOF)
    12     {
    13         index = 0;  //存放目标素数的个数
    14         flag = 1;   //解决空格问题
    15         for(x = 2 ; x < n ; x++ )
    16         {
    17             isPrime = 1;  //判断是否是素数
    18             for (i = 2; i < x ; i++)
    19             {
    20                 if (x % i ==0)
    21                 {
    22                     isPrime = 0;
    23                     break;
    24                 }
    25             }
    26             if (isPrime == 1)
    27             {
    28                 if( x%10 == 1){
    29                     //判断尾数是否是1
    30                     ans[index++] = x;
    31                 }
    32             }
    33         }
    34         for( i=0; i<index; i++){
    35             if(flag) flag=0;
    36             else printf(" ");
    37             printf("%d",ans[i]);
    38         }
    39     }
    40 
    41     return 0;
    42 }

     再补充一个素数筛选法,即在先筛选出一个范围内素数再做判断,这个速度更快,但是空间要求高

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 void Init( int n);
     5 
     6 int prime[2000];  //保存筛得的素数
     7 int primeSize;    //保存素数的个数
     8 int mark[10001];  //若mark[i]为1,表示其为非素数
     9 
    10 int main()
    11 {
    12     int n;
    13     int i;
    14     int flag;
    15     while( scanf("%d",&n)!=EOF)
    16     {
    17         if( n<=1) break;
    18 
    19         flag = 1;
    20         Init(n);
    21         for( i=0; i<primeSize; i++)
    22         {
    23             if(prime[i]%10==1)
    24             {
    25                 if( flag )  flag = 0;
    26                 else  printf(" ");
    27                 printf("%d",prime[i]);
    28             }
    29 
    30         }
    31         printf("
    ");
    32     }
    33     return 0;
    34 }
    35 
    36 void Init( int n)
    37 {
    38     int i,j;
    39     for ( i=1; i<n; i++)
    40     {
    41         mark[i] = 0;   //初始化所有的数字均没有被标记
    42     }
    43     primeSize = 0;
    44     for( i=2; i<n; i++)
    45     {
    46         if( mark[i]==1) continue;  //若已被标记则跳过
    47         prime[primeSize++] = i;    //否则新得到一个素数
    48         for( j=i*i; j<n; j+=i)    //将素数的倍数标记为非素数
    49         {
    50             mark[j] = 1;
    51         }
    52     }
    53 }
    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    Docker 给 故障停掉的 container 增加 restart 参数
    使用docker化的nginx 反向代理 docker化的GSCloud 的方法
    apache benchmark 的简单安装与测试
    mysql5.7 的 user表的密码字段从 password 变成了 authentication_string
    Windows 机器上面同时安装mysql5.6 和 mysql5.7 的方法
    python4delphi 安装
    见证下神奇的时刻
    windows下面安装Python和pip终极教程
    python如何安装pip和easy_installer工具
    Tushare的安装
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8439174.html
Copyright © 2011-2022 走看看