关于判断素数的一些算法

最近在hdu上A题

碰到些素数问题,记录下看到的算法。


一、筛选法

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2136


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class Main
{
    public static void main(String[] args) throws IOException
    {
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(
                new InputStreamReader(System.in)));
        int[] arr = new int[1000001];
        int count = 1;
        int temp;
        for (int i = 2; i < 1000000; i++)
        {
            if (arr[i] == 0)//只用判断不被前面“筛选掉的数字”
            {
                temp = i;
                while (temp < 1000000)//这里就是筛选数字,把i的整数倍的数字都挖掉
                {                     //因为肯定有因子i,则一定不是素数。
                    arr[temp] = count;//此处的赋值是因为题目的要求有点小改变,筛选法只用分别出素数和非素数
                    temp = temp + i;
                }
                count++;
            }

        }
        int n;
        while (st.nextToken() != StreamTokenizer.TT_EOF)
        {
            n = (int) st.nval;
            System.out.println(arr[n]);
        }
    }
}



思想很简单:



<1> 先将1挖掉(因为1不是素数)。
<2> 用2去除它后面的各个数,把能被2 整除的数挖掉,即把2的倍数挖掉。
<3> 用3去除它后面的各数,把3的倍数挖掉。
<4> 分别用5…各数作为除数去除这些数以后的各数。
上述操作需要一个很大的容器去装载所有数的集合,只要满足上述条件,即2的倍数大于1的全部置0,3的倍数大于1的全部置0,4的倍数大于1的全部置0.。。。一直到这个数据集合的末尾,这样一来不为0的数就是素数了,然后按下标在里面进行查找就好了



二、米勒拉宾算法

算法思想:http://www.cnblogs.com/skyivben/archive/2010/07/10/1775001.html

看了一下看不懂,记录下有这种算法思想。


你可能感兴趣的:(关于判断素数的一些算法)