找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; }
相关文章推荐
- 编程输出1000以内所有素数
- 第11周项目6-回文、素数 输出1000以内的所有素数、回文数、回文素数和10000以内的所有可逆素数(多文件组织程序)
- 第十一周项目6(4)求1000以内的所有素数
- 第十一周 项目6:(4)输出1000以内的所有回文素数
- 筛选法查找1000以内的素数c++代码实例及运行结果
- 筛选法求2-1000以内的素数
- 第一周第三天([算式][九九乘法表][求素数][求1000以内数相加但尾数是三的数跳出不计算][生小兔子问题] [金字塔问题] [求1+3+...+(2^20-1)的值][求1000以内的完全数])
- 第12周项目7-建立1000以内的素数、回文数、回文素数多文件组织
- 筛选法查找1000以内的素数c++代码实例及运行结果
- 求1000以内的素数
- 12周任务:求1000以内的素数
- Eratosthenes“埃氏筛法”求1000以内的素数C++
- 1000以内所有素数
- php输出1000以内质数(素数)示例
- 第十一周项目六——回文,素数(4)(输出1000以内的所有素数)
- 第十一周项目6——3 1000以内的素数
- 1000以内 回文数&&素数
- 输出1000以内的素数
- 输出1000以内的素数,回文数,回文素数,逆素数
- 第十一周项目6-回文、素数(输出1000以内所以素数)