找1000以内的素数

找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;
      }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值