黑马程序员技术交流社区

标题: 敲代码,品思想,回帖有奖 [打印本页]

作者: EYE_SEE_YOU    时间: 2013-8-12 12:52
标题: 敲代码,品思想,回帖有奖
本帖最后由 EYE_SEE_YOU 于 2013-12-16 23:23 编辑

参加本次活动先看以下链接

求质数算法的N种境界 (N > 10)

So,进入本次活动的主题吧,一切都是围绕着思想的
凡是:
       敲出其中代码的,
       提出不同思路的,
       技术性越强,奖励越高
       思想也是一样,都是有奖励的



作者: 黄兴旺    时间: 2013-8-12 13:30
那我就回一次看看
作者: yangchao313    时间: 2013-8-12 18:33
kankan                     
作者: 黄兴旺    时间: 2013-8-13 00:32
额  再来一次
作者: 夜空闪亮    时间: 2013-8-13 23:15
本帖最后由 夜空闪亮 于 2013-8-14 02:32 编辑
  1. import java.util.InputMismatchException;
  2. import java.util.Scanner;
  3. /*
  4. * 求质数的一种算法。
  5. * 算法思想:所谓质数,即除了1和它自己本身外没有其他的因数的数。经分析,对于任意一个自然数,其最大的因数不会超过其自身的一半,
  6. *                                 所以对于任意一个自然数,只需要让其对不超过自身一半大小的所有数逐一求摸,只要余数为0,则这个数就不是质数,否则它就是
  7. *                                 一个质数。
  8. * 程序功能:输入x值,查找出1-----x之间所有的质数并打印输出,同时在最后输出1------x之间质数的总个数,不包括x本身。这个程序完成的是需求1。
  9. * 算法实现代码如下:
  10. * */
  11. public class SeekPrime {
  12.         static int count = 0;                //记录查找到的质数的个数,初始值为0.
  13.         public static void main(String[] args)
  14.         {
  15.                 Scanner sc = new Scanner(System.in);
  16.                 System.out.println("请输入你所要求的宿舍的区间1------x中的x:");
  17.                 while(true)
  18.                 {
  19.                         try
  20.                         {
  21.                                 int x = sc.nextInt();
  22.                                 if(x<1)
  23.                                 {
  24.                                         System.out.println("你输入的数据必须是大于0的整数,请重新输入x:");
  25.                                         x = sc.nextInt();
  26.                                 }
  27.                                 justPrime(x);
  28.                                 System.out.println();
  29.                                 System.out.println("1------"+x+"之间的质数一共有"+count+"个。");
  30.                                 break;
  31.                         }catch(InputMismatchException e)
  32.                         {
  33.                                 System.out.println("你输入的数据有误,请重新输入x:");
  34.                                 sc = new Scanner(System.in);
  35.                         }        
  36.                 }
  37.         }
  38.         
  39.         
  40.         //寻找指定的1----x之间的质数。
  41.         public static void justPrime(int x)
  42.         {
  43.                 for(int j =1;j<x;j++)
  44.                 {
  45.                         if(j==1)
  46.                                 continue;
  47.                         int i =1;
  48.                         for(;i<=j/2;i++)
  49.                         {
  50.                                 if(j%i==0&&i!=1)
  51.                                         break;
  52.                                 else
  53.                                         continue;
  54.                         }
  55.                         if(i>j/2)
  56.                         {
  57.                                 count++;
  58.                                 if(count%15==0)                                //每15个质数换一行
  59.                                         System.out.println(j);
  60.                                 else
  61.                                         System.out.print(j+"\t\t");                //输出质数
  62.                         }
  63.                 }
  64.         }
  65. }
复制代码

作者: 夜空闪亮    时间: 2013-8-14 02:31
  1. import java.util.InputMismatchException;
  2. import java.util.Scanner;
  3. /*
  4. *  ◇需求2请实现一个函数,对于给定的整型参数 N,该函数能够从小到大,依次打印出自然数中最小的 N 个质数。
  5.         比如,当 N = 10,则打印出
  6.         2 3 5 7 11 13 17 19 23 29
  7. * 求质数的一种算法。
  8. * 算法思想:所谓质数,即除了1和它自己本身外没有其他的因数的数。经分析,对于任意一个自然数,其最大的因数不会超过其自身的一半,
  9. *                                 所以对于任意一个自然数,只需要让其对不超过自身一半大小的所有数逐一求摸,只要余数为0,则这个数就不是质数,否则它就是
  10. *                                 一个质数。
  11. * 程序功能:输入x值,依次打印出自然数中最小的 x 个质数。此程序完成的是需求2。
  12. * 算法实现代码如下:
  13. * */
  14. public class SeekPrime1 {
  15.         static int count = 0;                //记录查找到的质数的个数,初始值为0.
  16.         public static void main(String[] args)
  17.         {
  18.                 Scanner sc = new Scanner(System.in);
  19.                 System.out.println("请输入你所要求的质数的个数x:");
  20.                 while(true)
  21.                 {
  22.                         try
  23.                         {
  24.                                 int x = sc.nextInt();
  25.                                 if(x<1)
  26.                                 {
  27.                                         System.out.println("你输入的数据必须是大于0的整数,请重新输入x:");
  28.                                         x = sc.nextInt();
  29.                                 }
  30.                                 countPrime(x);
  31.                                 System.out.println();
  32.                                 break;
  33.                         }catch(InputMismatchException e)
  34.                         {
  35.                                 System.out.println("你输入的数据有误,请重新输入x:");
  36.                                 sc = new Scanner(System.in);
  37.                         }       
  38.                 }
  39.         }
  40.        
  41.        
  42.         //寻找指定的1----x之间的质数。
  43.         public static void countPrime(int x)
  44.         {
  45.                 for(int j =1;j<10000000;j++)
  46.                 {
  47.                         if(j==1)
  48.                                 continue;
  49.                         int i =1;
  50.                         for(;i<=j/2;i++)
  51.                         {
  52.                                 if(j%i==0&&i!=1)
  53.                                         break;
  54.                                 else
  55.                                         continue;
  56.                         }
  57.                         if(i>j/2)
  58.                         {
  59.                                 count++;
  60.                                 if(count<=x)
  61.                                 {
  62.                                         if(count%15==0)                                //每15个质数换一行
  63.                                                 System.out.println(j);
  64.                                         else
  65.                                                 System.out.print(j+"\t\t");                //输出质数
  66.                                 }
  67.                                 else
  68.                                         break;
  69.                         }               
  70.                 }
  71.         }
  72. }
复制代码

作者: taotao    时间: 2013-8-15 08:40
在1~sqrt(n)之间找就行了。在判断玩2、3、5...等数之后,顺便可以排除他们的倍数。
作者: 单凯    时间: 2013-8-15 09:14
什么时候再有技术分的活动
作者: hoyouly    时间: 2013-8-19 13:39
我也回复一个算法吧。

import java.util.Scanner;

public class PrimeTest {
        public static void main(String []args)
        {
                System.out.println("请输入你要求素数区间的最大值:");
                Scanner in=new Scanner(System.in);
               
                int x=in.nextInt();
                getPrime(x);
        }

       
        public static void getPrime(int x)
        {/*想法,在(2,x]这个区间中所有的偶数都不是素数
                这样范围就减少一半了,这个小区间中能被3整除的数也都不是素数,
                */
                System.out.print("1~"+x+"之间的素数有:2,3");
                        for(int i=3;i<=x;i+=2){               
                                if(i%3==0)
                                        continue;               
                                        for(int j=2;j<=Math.sqrt(i);j++){
                                        if(i%j==0)
                                                break;
                                        }
                                        System.out.print(","+i);
                        }
               
        }
}

作者: 黑马-文鸿利    时间: 2013-8-19 16:03
publicclassPrime{ /**
         * 一般求素数方法
         *
         * @param args
         */publicstaticvoidmain(String[]args){for(inti=2; i<100; i++){intj;
for(j=2; j<(int)(Math.sqrt(i)+1); j++) {if(i%j==0){break;}}
if(j>(int)Math.sqrt(i)){System.out.print(i+" ");}} } }

作者: 黑马-文鸿利    时间: 2013-8-19 16:03
publicclassPrime2{ /**
         * 筛法求素数
         *
         * @param args
         */publicstaticvoidmain(String[]args){// TODO Auto-generated method stubintn=100;
int[]array=newint[n];for(inti=2; i<n; i++)array[i]=i;
for(inti=2; i<n; i++){if(array[i]!=0){intj, temp;

作者: 张俊生    时间: 2013-8-19 23:06
回帖看看   
作者: 黑马-文鸿利    时间: 2013-8-20 07:38
public class Test {
    public static void main(String[] args) {
          //循环100以内的数
          for (int n=1;n<=100;n++){
           //给b初始值true
           boolean b = true;
           //如果循环拿到的数n不等于1,就进入下面循环
           if (n != 1 ){
            //i从大于1的第一个数也就是2开始,一次循环到比这个数n本身小的最大的数
            //何为质数,除了1和他本身不能再被其他数整除。所以...这样循环
            for (int i = 2; i < n; i++){
             if (n % i == 0){//如果取余为0,也就是除了1和其本身有其他数可以乘除他,所以置为false
              b = false;
              //跳出当前循环,判断是否打印,并且到外面循环继续
              break;
             }

            }
           }
           //如果b为true打印下面的质数
           if (b){
            System.out.println(n + "是质数");
           }
          }
         }
}

作者: 许云龙    时间: 2013-8-20 10:24
  1. <div class="blockcode"><blockquote>
  2. /*
  3. * 经过对质数的分析,发现质数属于奇数的一部分(除了2),质数只能被1和其自身整除,当然奇数是不能被任何偶数整除的,
  4. * 所以质数也不能被任何偶数整除的(不包含2);还发现任何奇数的除数都不会超过其本身的一半,且还有一些规律
  5. * 结论:只要判断是否能够被一些奇数整除,便可知道此数书否为质数。
  6. * */
  7. public class ClassFor {
  8.         public static void main(String[] args){
  9.                 show(7); //在这里输入大于7的任何数
  10.         }
  11.         public static void show(int i){
  12.                 StringBuilder sb = new StringBuilder();
  13.                 sb.append("2,3,5,7,");
  14.                 int num =0;
  15.                 for(int x= 9;x<=i;x+=2) //定义x的取值范围小于等于用户指定的数i
  16.                 {
  17.                         for(int y =1;y<=(x-1)/2;y+=2) //产生一定范围内的奇数
  18.                         {
  19.                                 if(x%y!=0) //判断书否能够被产生的奇数整除
  20.                                         num=x;         //不能整除将产生的奇数存储
  21.                         }
  22.                         if(num!=0)
  23.                                 sb.append(num+",");
  24.                 }
  25.                
  26.                 sb.deleteCharAt(sb.length()-1);
  27.                 System.out.println(sb);
  28.         }

  29. }
复制代码

作者: 黑马-文鸿利    时间: 2013-8-20 10:55
public class test3 {
/**
  * @param args
  */
public static void zs(int n){
  boolean flag = false;
  for(int i = 2 ; i<=n/2 ;i++){
   if(n % i == 0){
    flag = true;
    break;
   }
  }
  if(!flag){
   System.out.println(n+" 是质数!");
  }
  n--;
  if(n==2){
   System.out.println("2 是质数!");
  }else{
   zs(n);
  }
  
}
public static void main(String[] args) {
  zs(100);
}
}
作者: HM张博文    时间: 2013-8-20 15:30
写一个判断质数的函数,参数是n,从2到sqrt(n)不停的除这个数,如果能整除,就不是质数,如果不能整除,就是质数
作者: 黑马-文鸿利    时间: 2013-8-20 15:42
public class test3 {
/**
  * @param args
  */
public static void zs(int n){
  boolean flag = false;
  for(int i = 2 ; i<=n/2 ;i++){
   if(n % i == 0){
    flag = true;
    break;
   }
  }
  if(!flag){
   System.out.println(n+" 是质数!");
  }
  n--;
  if(n==2){
   System.out.println("2 是质数!");
  }else{
   zs(n);
  }
  
}
public static void main(String[] args) {
  zs(100);
}
}

作者: 穿靴子的猫    时间: 2013-8-21 00:21
有活动真好啊
作者: 黑马-文鸿利    时间: 2013-8-21 09:49
import java.util.Scanner;

public class PrimeNumber {
        public static void main(String[] args) {
                System.out.println("input numbers:");
                Scanner scan = new Scanner(System.in);
                int num = scan.nextInt();
                int flag = 1;
                for (int i = 2; i < (num / 2); i++) {

                        if (num % i != 0) {
                                flag = 1;
                        } else {
                                flag = 0;
                        }

                }
                if (flag == 1) {
                        System.out.println(num + "是质素!!");

                } else {
                        System.out.println(num + "不是质素!!");
                }

        }
}
作者: doevents    时间: 2013-9-15 03:09
import java.util.Scanner;

/*
* 素数:只能被1和本身整除的数。(不包括1)
* 需求:输出1~n之间的所有素数,每行打印5个
* 2  3  5  7  11
* 13 17 19 23 29...
* 思想:所谓素数,是和in呢个被1和本身整除的自然数,判断一个自然数是不是素数,
* 只要将逐一求模运算(从1开始,到这个自然数的一半),只能被1和本身整除的数,都可以称之为素数,,反之则不是素数。
* 程序实现:输出1~n之间的所有素数,每行打印5个。
* 代码:
* */
public class PrimeNumberDemo {

        /**
         * @author Doevents
         *
         */
        public static void main(String[] args) {
                prime();
        }
       
        public static void prime(){
                int t=0;  //定义打印个数
                boolean flag;
                Scanner sc=new Scanner(System.in);
                System.out.println("请输入素数的个数:");
                int k=sc.nextInt();
                System.out.println("1~"+k+"之间的素数有:");
                for(int i=2;i<=k;i++){
                        flag=true;
                        for(int j=2;j<=i/2;j++){
                                if(i%j==0){
                                        flag=false;        //非素数
                                        break;
                                }
                        }
                        if(flag){
                                System.out.print(i+"\t");
                                t++;        //累加器
                               
                                if(t%5==0){        //每行输入5个
                                        System.out.println();
                                }
                        }
                }               
        }
}
作者: 咕咕猫    时间: 2013-9-15 07:55
本帖最后由 咕咕猫 于 2013-9-15 08:18 编辑

素数即为除1和它本身之外不再被其他数正除的数,1除外
class Demo
{
        public static void main(String[] args)
        {
                 SuShu ss = new SuShu();//建立对象
                 ss.method(1000);//传入所要求素数的范围
        }
}
class SuShu
{
        public void method(int n)
        {
                for (int y=0,z=2;z<n;z++ )
                        {
                                if(z==2)
                                System.out.println(2);
                                if (z%2!=0)//除2之外能被2整除的肯定不是素数
                                {
                                        for (int x=2;x<(z-1)/2 ; x++)//此处只要n值除到自己的一半即可,比如n=97,只需除到x=48即可
                                        {
                                                if(z%x==0)//被整出一次y值就加一次
                                                y++;
                                                if(y>=1)//如果出现了那证明肯定不是素数了直接结束此次循环即可
                                                        break;
                                        }
                                                if (y==0)
                                                {
                                                        System.out.println(z);
                                                }
                                                y=0;//将y值归零重新计数
                                }
                        }
        }
}




作者: 梦航    时间: 2013-9-15 08:32
很不错、、、
作者: 常在河边走_    时间: 2013-9-16 14:20

import java.util.Scanner;  
  
public class Test {  
  
    private static Scanner sc;  
   
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
  
        System.out.print("请输入一个整数:");  
        sc = new Scanner(System.in);  
        int a = sc.nextInt();  
        boolean f = Brute_Force(a);  
        System.out.println(a + "是否为质素(素数):" + f);  
    }  
  
    public static boolean Brute_Force(int n) {  
        if(n!=1){  
            for (int i = 2; i <= Math.sqrt(n); i++){  
                if (n % i == 0){  
                    return false;  
                }  
            }  
            return true;  
        }else{  
            return false;  
        }  
    }  
  
}
作者: aspoMAN    时间: 2013-9-23 23:38
赞一个 不错
作者: kongyan4696    时间: 2013-12-16 10:54
先看下。
作者: kongyan4696    时间: 2013-12-16 10:57

  1.                 /**
  2.                  * 查找100以内的质数
  3.                  */
  4.                 ArrayList<Integer> primeNumber = new ArrayList<Integer>();
  5.                 lable: for (int i = 2; i < 100; i++) {
  6.                         if (i == 2 || i % 2 != 0) { // 质数是除2以外的奇数
  7.                                 int sqrt = (int) Math.sqrt(i);// 一个数如果是合数,那么它的所有的因子不超过它的开方
  8.                                 for (int j = 0, h = primeNumber.size(); j < h; j++) {
  9.                                         // 获得已经得到的质数
  10.                                         int number = primeNumber.get(j);
  11.                                         // 能被平方根以内的质数整数的都是合数
  12.                                         if (number > sqrt || i % number == 0) {
  13.                                                 continue lable;
  14.                                         }
  15.                                 }
  16.                                 primeNumber.add(i);
  17.                         }
  18.                 }
复制代码


很简单的一个方法。
作者: kongyan4696    时间: 2013-12-16 11:00


  1. /*
  2. * Created on 2004-10-7
  3. * 文件名:GetSs.java
  4. */
  5. //package ss;



  6. import java.io.BufferedReader;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.util.Vector;



  10. /**
  11. * <p>输出指定值域内的素数</p>
  12. * <p>手工设置每行显示的素数的个数</p>
  13. * @author jly
  14. */
  15. public class GetSs {
  16. //起始值
  17. private int iStartVal = 0;
  18. //终止值
  19. private int iEndVal = 0;
  20. //输出结果时每行显示的素数的个数
  21. private int iNumPerLine = 3;
  22. //存放素数的Vector
  23. private Vector vSs = new Vector();

  24. /**
  25.   * <p>构造器</p>
  26.   * <p>无参数</p>
  27.   */
  28. public GetSs(){
  29.   setStartVal(getParam("请输入起始值:"));
  30.   setEndVal(getParam("请输入终止值(最大值):"));
  31.   setNumPerLine(getParam("请输入每行显示的素数的个数:"));
  32.   getSs();
  33. }

  34. /**
  35.   * 从命令行读取整型值参数
  36.   * @param msg 需要在命令行显示的提示语言
  37.   * @return 输入的值
  38.   */
  39. public int getParam(String msg){
  40.   BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
  41.   int iParam = 0;
  42.   
  43.   //所有的值必须大于零
  44.   while(iParam <= 0){
  45.    System.out.print(msg);
  46.    try {
  47.     iParam =  Integer.parseInt( br.readLine() );
  48.    } catch (NumberFormatException e) {
  49.     e.printStackTrace();
  50.     System.out.println("格式错误,请重新输入!");
  51.     iParam = 0;
  52.    } catch (IOException e) {
  53.     e.printStackTrace();
  54.     iParam = 0;
  55.    }
  56.   }
  57.   return iParam;
  58. }

  59. /**
  60.   * 设置起始值
  61.   * @param iStartVal 起始值
  62.   */
  63. public void setStartVal(int iStartVal){
  64.   this.iStartVal = iStartVal;
  65. }

  66. /**
  67.   * 设置终止值
  68.   * @param iEndVal 终止值(最大值)
  69.   */
  70. public void setEndVal(int iEndVal){
  71.   this.iEndVal = iEndVal;
  72. }

  73. /**
  74.   * 设置输出时每行显示的素数的个数
  75.   * @param iNumPerLine 每行显示的素数的个数
  76.   */
  77. public void setNumPerLine(int iNumPerLine){
  78.   this.iNumPerLine = iNumPerLine;
  79. }

  80. /**
  81.   * 获取指定范围内的所有素数
  82.   */
  83. private void getSs(){
  84.   int i = iStartVal;
  85.   while(i <= iEndVal){
  86.    if( isSs(i) ) vSs.add( String.valueOf(i) );
  87.    i++;
  88.   }
  89. }

  90. /**
  91.   * 判断某整型值是否为素数
  92.   * @param iSsVal 需要判断的值
  93.   * @return 是否为素数
  94.   */
  95. private boolean isSs(int iSsVal){
  96.   for(int i = 2; i <= iSsVal / 2; ++i){
  97.    if(iSsVal % i == 0) return false;
  98.   }
  99.   return true;
  100. }

  101. /**
  102.   * 根据指定每行显示的个数打印指定范围的素数
  103.   */
  104. public void printSs(){
  105.   System.out.println(iStartVal + " - " + iEndVal + "之间共有" + vSs.size() + "个素数:");
  106.   for(int i = 0; i < vSs.size(); ++i){
  107.    System.out.print(vSs.get(i).toString() + "  ");
  108.    if( (i + 1) % iNumPerLine == 0 ){
  109.     System.out.println("");
  110.    }
  111.   }
  112. }

  113. /**
  114.   * 主程序
  115.   * @param args 可能用到的参数
  116.   */
  117. public static void main(String[] args){
  118.   //生成实例
  119.   GetSs gss = new GetSs();
  120.   //输出指定范围内的所有素数
  121.   gss.printSs();
  122. }



  123. }
复制代码


这个是在pudn下载的求素数方法,看起来还不错
作者: kongyan4696    时间: 2013-12-16 11:05
  1. import java.math.BigInteger;
  2. public class aaa {
  3.   public static void main(String[] args){
  4.      BigInteger bi = BigInteger.ZERO;  
  5.      while (true) {  
  6.          bi = bi.nextProbablePrime();  
  7.          if (bi.intValue() > 100) {  
  8.              break;  
  9.          }  
  10.          System.out.print(bi + " ");  
  11.      }
  12.   }
  13. }
复制代码



作者: 路国强    时间: 2013-12-16 11:21
试一试。运气
作者: 路国强    时间: 2013-12-16 11:24
额,再来一个试一试
作者: kongyan4696    时间: 2013-12-16 11:24
回帖看看   
作者: 路国强    时间: 2013-12-16 11:25
试试手气吧
作者: 路国强    时间: 2013-12-16 11:27
试试手气,加油
作者: 路国强    时间: 2013-12-16 11:28
加油黑马,我来了
作者: 路国强    时间: 2013-12-16 11:29
嘎嘎嘎嘎嘎。好多分
作者: 路国强    时间: 2013-12-16 11:30
试试试试。看看
作者: 路国强    时间: 2013-12-16 11:32
回复再来
作者: 路国强    时间: 2013-12-16 11:34
回复回复。加油
作者: 路国强    时间: 2013-12-16 11:35
黑马加油。再来一次
作者: 路国强    时间: 2013-12-16 11:37
再来一次,我一定要去黑马,黑马加油。给我分吧
作者: EYE_SEE_YOU    时间: 2013-12-16 23:20
路国强 发表于 2013-12-16 11:37
再来一次,我一定要去黑马,黑马加油。给我分吧

少年,这样不太好吧
作者: sd110572    时间: 2013-12-19 17:25
楼上碉堡了额,跪拜
作者: huazi    时间: 2013-12-21 09:42
分已经被海贼哥抢完了吧,让我等情何以堪
作者: EYE_SEE_YOU    时间: 2013-12-21 13:51
huazi 发表于 2013-12-21 09:42
分已经被海贼哥抢完了吧,让我等情何以堪

给他分已经收回来了,别惦记这种事
作者: Aenon    时间: 2014-2-28 14:43
还有木有分
作者: 绿@Live    时间: 2014-2-28 14:49
分 分完了吗???
作者: Aenon    时间: 2014-2-28 14:55
记下来 研究一下
作者: m313786372    时间: 2014-3-29 05:26
先回一下看看
作者: Louis.hui    时间: 2014-8-22 15:52
厉害,赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2