您的位置:首页 > 其它

找1000以内的素数

2014-11-18 16:30 183 查看


找1000以内的素数

题目:找1000以内的素数

不用循环,用递归

思路:从最大的往下除,除数一直增大到根号的级别,将合数和质数进行标记,注意判断除数和被除数相同的情况

代码:
public void noRepeat(int[] arr,int i,int j){
findPrime(arr, i, j);
for(int k=2;k<1001;k++){
if(arr[i]!=1)
System.out.println(k);
}
}
static int [] arr=new int[1001];
static int length=(int) Math.sqrt(1000);
public void findPrime(int [] arr,int i,int j){
if(arr[i]==1||i==2||arr[i]==-1)//界限的结束标识
return;
if(j>length||i==j){    //标示直到自己本身,或者根号范围外还是不可以整除
arr[i]=-1;
findPrime(arr, i-1, 2);
}

if(i!=j&&i%j==0){    //标示可以被整除,不是质数,再次判断i!=j,防止回溯的时候再次计算,导致结果仍然错误
arr[i]=1;
findPrime(arr, i-1, 2);
}
else
findPrime(arr, i, j+1);
}


用循环标示

思路:用一种以一个因子,然后排除所有包含这个因子的情况,逆向思维去找合数进行标记,特别注意这段代码:
for(int i=2;i<=num;i++){//i从2到根号n进行标示
if(arr[i]!=0){
int j=arr[i]*arr[i];
while(j<=n){
arr[j]=0;
j=j+arr[i];
}
}
}


代码:
public void printf(){
int[] arr=new int[1000];
for(int i=1;i<arr.length;i++){    //初始化数组
arr[i]=i;
}
int[] narr=sileve(arr);//得到素数表
int temp=0;
while(narr[temp]!=0){    //进行输出
System.out.print(narr[temp]+" ");
if(temp%10==0)
System.out.println();
temp++;
}
}
//使用逆向思维的方法,直接标识素数
public int[] sileve(int[] arr){
int n=arr.length-1;
int num=(int)Math.sqrt(n);

for(int i=2;i<=num;i++){//i从2到根号n进行标示
if(arr[i]!=0){
int j=arr[i]*arr[i];
while(j<=n){
arr[j]=0;
j=j+arr[i];
}
}
}
int[] Narr=new int[arr.length];
int temp=0;
for(int i=2;i<n;i++){
if(arr[i]!=0){
Narr[temp++]=arr[i];
}
}
return Narr;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  素数