判断10000000以内素数的方法---进化过程

一:暴力求解(直接根据素数的定义)

//返回1:是素数;返回0:非素数

int isPrime(int n)
{
  int i;

  if(n<2) return 0;
  for(i=2;i<n;i++)
    if(n%i==0) return 0;
  return 1;
}

然而想要通过此方法快速获得10000000以内的素数总数的话,难......
二:除去部分因数求解(平方根和偶数助力)

首先,能被2整除的数----非素数;

其次,举例数36,开方得6。好,我们来看看25可以分解成哪些因数。
    正序来看,36=1*36=2*18=3*12=4*9=6*6;

    反序来看,36=36*1=18*2=12*3=9*4=6*6;

  再举一个例,24,开方不能得到一个整数,近似于4或5,设为x(较小值)和y(较大值);

    正序来看,24=1*24=2*12=3*8=4*6

    反序来看,24=24*1=12*2=8*3=6*4

举这两个例子是想说明要是我们在判断某数是否为素数时,如果在判断某数如果除以它的平方根后依旧不能被整除,那么就可判断该数为素数;

  像24的平方根不是整数时,使用sqrt函数不能确保某数开方得到的是x还是y,那么判断范围扩大到sqrt函数得到的数+1即可确保。

int isprime(int n)
{
  int i;
  if(n==2)  return 1;
  else if(n<2 || n%2==0)  return 0;
  else
    for(i=3;i<=sqrt(n)+1;i+=2)
      if(n%i==0) return 0 ;
  return 1;
}

三:制表法进阶(开一个内存,利用指针)

设某数x,如果判断到x的质因数为a,b,c.......那么此时将凡是a,b,c....的倍数均做上标记;

下次遇见直接跳过;

不可避免地需要使用数组。但如果想开容量很大的数组(如10000000),编译器不能接受?(...猜测溢出?)

所以尝试使用指针;

int prime(int n)
{
  int counts;
  int i;

  //使用指针

  unsigned char *prime =(unsigned char*)malloc(n+1);
  for(i=2;i<n;i++)
    prime[i]=1;
  for(i=2;i<=n;i++)
  {
    if(prime[i])
    {
      counts++;
      for(int j=i+i;j<n;j+=i)
      prime[j]=0;
    }
  }
  free(prime);
  printf("%d",counts);
  return 0;
}

原文地址:https://www.cnblogs.com/JaneLin0409/p/12237290.html

时间: 2024-10-12 20:54:27

判断10000000以内素数的方法---进化过程的相关文章

关于求N以内素数的python实现以及优化方法

大纲: 摘要 一.素数的定义 二.N以内素数常用实现方法 三.优化方法 原理层面 代码层面 range和xrange while 1和while True真的重要吗 摘要 本文主要是参考<编程珠玑-续订版>第一章关于求素数的解释,描述素数的定义,以及N以内素数的常用求解方法,最后一步步给出优化方法.代码用python实现两个优化方法,并给出原理层面和代码层面的分析.其中比较有意思的是,最后的部分,最开始代码写的只是考虑功能实现,而没有考虑怎样优化,最后的结果却大跌眼镜.反思之后,发现代码中的问

判断素数的方法

判断n是否为素数 1.最简单的方法:用n除以2~sqrt(n),有一个能除尽就不是素数,否则是素数.时间复杂度:O(sqrt(n)) 为什么是sqrt(n),n的开方呢? 假设n是个合数,它必然可以由两个数a,b相乘而得到,即a*b = n.在这两个数中,如果a>sqrt(n), 则b<sqrt(n),同理b>sqrt(n), 则a<sqrt(n),若a=b即为a,b中最小的那个数的值最大的情况,a*a=n, 即a=sqrt(n). 所以可以证明 :如果我们要判断一个数n是素数还是

求100以内素数的5中基本方法及其优化

求100以内素数的5中基本方法及其优化方法1 基本做法 错解比较:进入了小循环:有时加pass也可以.错解:这里的print也同样注意不要写到循环内. 注释:1.两种条件运用:为合数.2.以上错误点.方法二 注释:1.条件运用,质数除了2都是奇数,因为偶数都能被除了自身外的2整除.改进自12.偶数除了2都不是质数.3.第二个for写的是到开方的奇数.4.奇数含有质数和非质数.偶数除了2一定不是质数.所以先剥离了偶数. 方法三:使用列表 注释:1.break continue pass2.质数i依

代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

package com.heima.Coding; /* 判断101-200之间有多少个素数(质数),并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数.*/ public class Test { public static void main(String[] args) { int count = 0; for (int i = 100; i < 200; i++) { for (int j = 2; j <=

(20140707作业)一入IT深似海,从此节操是路人!~9*9乘法表&amp;千以内素数

这是我们老大培训第一天的作业,今后几乎左右的作业都会记录在这. 2014-07-07 要求: C#基本语法实现 九九乘法表 和1000以内所有质数 几个新手同事,有刚毕业的学生,有做机电出身,也有硬件做硬件的. 大家可能想法不一,所以集思广益,对于好的思路,我这里借鉴并留存. 大铿的代码: 1 //求 千以内的素数 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Tex

判断质数的几种方法

根据维基百科定义,质数(Prime number),又称素数,指在大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数(也可定义为只有1和本身两个因数的数).比1大但不是素数的数称为合数.1和0既非素数也非合数.质数在公钥加密算法(如RSA)中有重要的地位. 下边将会介绍几种较为常见的判断质/素数的方法: 1. 法一:最直接也最笨的方法 法一是按照质数的定义来考虑的,具体程序见下: 1 //*********************************** method 1 **

埃氏筛法(快速筛选n以内素数的个数)

给你一个数n,请问n以内有多少个素数?(n <= 10e7) 一般来说,要是对一个整数进行素数判断,首先想到的是写个函数判断是否为素数,然后调用这个函数,时间复杂度为O(n^(½)),但是要求n以内的素数就略显吃力了. 要是求n以内的素数个数的话,可以用埃式筛选.预处理一下. 先看下面的代码: 1 /* 2 |埃式筛法| 3 |快速筛选素数| |15-7-26| 4 */ 5 #include <iostream> 6 #include <cstdio> 7 using na

JAVA基本算法面试题:2判断并输出素数

题目:判断101-200之间有多少个素数,并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数.    public class Test001{ public static void main(String[] args){ System.out.println("100到200之间的素数:"); System.out.println("总计多少个素数:"+prime()); } pub

python读取一个文件的每一行判断是否为素数,并把结果写到另一个文件中

刚刚学习python的菜鸟,这道题包括:文件的读写,python的参数调用,异常的使用,函数的使用 创建一个文本文件inti_prime.txt 执行命令:python Prime.py init_prime.txt result_prime.txt 会生成一个result_prime.txt文件 1 #-*- coding:UTF-8 -*- 2 #读取一个文件的每一行,每一行为一个数字 3 #判断数字是不是素数 4 #并打印结果到另外一个文件 5 #输入文件名和输出文件名用参数的形式 6 i