素数判断 与筛法求素数 Java

</pre>素数判断有很多 种方式: 这个很关键 而用java进行有其巧妙之处<p></p><p>思想:</p><p>    先循环列出从二开始的所有数a  2 ~ 100</p><p>    其次 再从 2 到 sqrt(a) 判断 是否能整除如果能 那么从开始执行程序 有递归的思想在里面,c++中递归有点不一样</p><p>   最后输出结果就可以了:</p><p>代码:</p><p></p><pre code_snippet_id="142173" snippet_file_name="blog_20140104_1_257831" name="code" class="java">import java.io.*;
public class sushu {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a, b;
		System.out.println("100 以内的素数是:");
		A:
		for(a = 2; a <= 100; a++)
		{
			for(b = 2; b*b<a+1; b++)
			{
				if(a%b == 0)  continue A;
			}
			System.out.println(a+ " ");
		}

	}

}

其他的 c ++ 中判断素数的方法:

  首先: 先用一个函数来判断数数 函数的思想很简单 即把 2 ~ sqrt(a) 所有数遍历一遍  如果能整除那么返回false  最终返回 true

   其他:  也就没有什么了, 按你的要求打印出需要的就可以了

源代码:

#include<iostream>
using namespace std;

bool isPrime(int n)
{
    int d ;
    for(d = 2; d*d <= n; d++)
    {
        if(n%d == 0) return false; //子要其中有一个可以被整除 都return false 因此来说这是合数
    }
    return true;
}
int main()
{
    int  i, n;
    while(cin>>n)
    {
        for(i = 2; i <= n; i++)
        {
            if(isPrime(i))
            {
                cout<<i<<" ";
            }
        }
    }
    return 0;
}


筛法求素数:

这里介绍一种线性筛法理论,可以知道,每个合数可以分解为素数和其他数的乘积,有每个合数有最大的一个因子或者一个最小的因子,因此采用其最素数因子消掉这个合数,因此只要消掉一次;

怎么说呢,如果 i= 2*3*5  ;

先筛掉 2*i 如果可以筛掉 3*i那么  3*3*5也会被筛掉 那么删除 2*i就和前面的重复里

源代码:

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;

const int maxv = 100;
bool flag[maxv+1];//用来标记所有的数是否是合数
int  prime[maxv+1];//这个数组用来记录素数
int tot = 0;
void getPrime()
{
     int i, j;
     memset(flag,true, sizeof(flag));

     for(i = 2; i <= maxv ; i++)
     {//筛法求素数是从2开始判断的
        if(flag[i])  prime[tot++] =i;//素数赋值给prime数组储存起来
        for(j = 0; j <tot && i*prime[j] < maxv ;j++ )
        {//prime[j] 代表的就是最小素数的意思
            flag[i*prime[j]] = false;//将i的倍数全部消掉
            if(i%prime[j] == 0) break;//这是为什么只消一次的原因
        }
     }

}
int main()
{
    int i;
    getPrime();
    for(i = 0; i < tot ;i++)
    {
        cout<<prime[i]<<" ";
    }
    cout<<endl;
    system("pause");
    return 0;
}
说明来什么一个合数可以写成几个数的素数的乘积 这样复杂度就降低了

                                                                                               

                                                                                                                                                               j

上面是线性筛法求素数  复杂度是O(n)   现在给出解释  i = 2 从素数 2 开始     tot  = 1  prime[0] = 2 4  清除

                                                                                                  i = 3                3        tot = 2   prime[1]  = 3   2*3  3*3 清除

                                                                                                   i= 4                            忽略

                                                                                                   i = 5                                 3          prime[3] = 5  5 *2  5*3  5*5 清除。。。。

                                                               这里面 6 只被筛掉 一次 只要运算一次 就可以了 复杂度是减少的

下面给出一种基本筛法求素数的办法:

#include<iostream>
using namespace std;

int u[1009];
int su[1009];  //存储素数的
int n ;
int num = 0;
void prepare()
{//采用素数打表的方式输出素数
    int i , j;
    for(i= 2 ; i < 1001; i++)
    {
        u[i] = 1;
    }
    for(i = 2; i < 1001; i++)
    {
        if(u[i])
        {   // 2  3
            for(j = 2; j*i<1001; j++ )
            {// 2 * 2 2 *3 .。。。。。 2* 被筛掉 3 *2 3 * 3.。。。。。 也就是说6 被筛掉两次 多运算来一次 复杂度增加
                u[j*i] = 0;
            }
        }
    }
    for(i = 0 ; i < 1001; i++)
    {
        if(u[i])
        {
            su[num++] = i;
        }
    }
}
int main()
{
    prepare();
    int n ;
    while(cin>>n)
    {
        int i;
        for(i = 0 ; i < n; i++)
        {
            cout<<su[i]<<" ";
        }
    }
    return 0;
}

这里普通筛法求素数的 发杂度 为O(nlog(n))   复杂度是比较大的 反正不太好。。。


提供Python 实现思路:


import sys
max =1000
aList =[]*max
prime=[1]*max #存去素数都数组
num = 0 #素数的个数

'''
for  i in range(0, max):
   print(prime[i])
'''

#  建立一个标记数组 标记素数还是其他 默认是0 表示是素数
for i  in range(0, max+1):
   aList.append(0)

for i in range(2, max+1):
    if(aList[i] == 0):
        prime[num] = i
        num = num +1
    for j in range(0,num):
        # 去掉合数 素数乘以另外一个数就是合数
        if(i*prime[j] <= max):
         aList[i*prime[j]] = 1

for i in range(0, num):
    print(prime[i],end=" ")





wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值