zoukankan      html  css  js  c++  java
  • java求素数和求一个数的一个正整数的质因数

    1、题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少对?

      (1)程序分析:不难发现兔子的规律是:1,1,2,3,5,8,13,21....

        其实这个问题也就是求斐波那契数列的问题。

      (2)思路:应用递归来实现。1,2月的时候总数为一对,从第三个月开始就会产生一个新兔子,总数为2对,也就是born(n-1)+born(n-2)

      (3)代码实现:

     1 /**
     2  * 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
     3  * @author lixiaochao
     4  * 兔子的规律为:1,1,2,3,5,8,13,21....
     5  */
     6 public class Rabbit {
     7     public static void main(String[] args) {
     8         int n = 5;   //
     9         int m = 0;   //兔子总数
    10         m = born(n);
    11         System.out.println("一共有"+m);
    12     }
    13     public static int born(int n){
    14         if(n == 1){
    15             return 1;
    16         }else if(n == 2){
    17             return 1;
    18         }else{
    19             return born(n-1)+born(n-2);
    20         }
    21     }
    22     
    23 }

      总结:当时看这个问题的时候,一看有点绕,而且很容易绕晕了,我们现在开始把他列举一下,从而发现出规律,然后转换一下求斐波那契数列的问题,这个问题就会很容易做了。

        有的时候我们可以转换一下思路,问题有可能会变得很简单的。

    2、判断101-200之间有多少个素数,并输出所有的素数,

      (1)分析:首先我们要先了解判断素数的方法是什么,用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。这种方法非常简单效率也非常快。

      (2)思路:略。(因为比较简单,所以省略掉了,如果大家对这个有疑问,可以留言告诉我)

      (3)代码:

     1 /**
     2      * 判断101-200之间有多少个素数,并输出所有素数。
     3      * 
     4      * 分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数
     5      */
     6 //    @Test
     7     public void test01(){
     8         int num = 0;
     9         
    10         List<Integer> list = new ArrayList<Integer>();
    11         for(int i = 101; i < 201; i++){
    12             boolean flag = true;   //每次执行的时候把flag置为true
    13             for(int j = 2; j < Math.sqrt(i)+1;j++){
    14                 if(i % j == 0){
    15                     flag = false;
    16                     break;
    17                 }
    18             }
    19             if(flag){
    20                 num ++;
    21                 list.add(i);
    22                 System.out.println(i);
    23             }
    24         }
    25         System.out.println("素数的个数为:"+num);
    26         for(Integer n : list){
    27             System.out.println(n);
    28         }
    29     }
    30     

      总结:对于问题,我们要先想好解决问题的最好的方法,不要急于写代码,找到合理的算法才是解决问题最有效的途径。

    3、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 

      (1)分析:

        对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成: 

        * (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
        * (2)如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数,重复执行第一步。
        * (3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。

      (2)思路:先找到一个最小的质数i,这个数n是否能够整除这个最小的质数i,如果能整除,则n=n/i,如果不能整除,i=i+1,在再判断这个是n是否能够整除i+1,当这个质数恰好等于n的时候分解质因数结束。

      (3)代码如下:

     1 /**
     2      * 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 
     3      * 程序分析:对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成: 
     4      * (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
     5      * (2)如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数,重复执行第一步。
     6      * (3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。
     7      * 
     8      */
     9     @Test
    10     public void test(){
    11         int n = 7;
    12         int i = 2;
    13         while(true){
    14             if(n == i){
    15                 System.out.println(i);
    16                 break;
    17             }
    18             if(n%i == 0){
    19                 System.out.println(i);
    20                 n = n / i;
    21             }else{
    22                 i = i+1;
    23             }
    24         }
    25     }

      总结:多看,多想,多练!!!

  • 相关阅读:
    【原创】大数据基础之Hadoop(3)yarn数据收集与监控
    【原创】运维基础之Docker(7)关于docker latest tag
    【原创】大数据基础之ElasticSearch(4)es数据导入过程
    【原创】大叔经验分享(44)hdfs副本数量
    【转】IAR IDE for MSP430、8051、ARM等平台的结合使用
    写驱动的步骤
    【转】IAR for STM8介绍、下载、安装与注册
    KEIL中函数定义存在但go to definition却不跳转的原因
    FatFs
    学习2__STM32--汉字显示
  • 原文地址:https://www.cnblogs.com/lixiaochao/p/5666695.html
Copyright © 2011-2022 走看看