</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=" ")