Java算法问题学习笔记(一)(兔子问题、素数判断、水仙花数、正整数分解、最大公约数问题)

一、斐波那契数列(兔子问题)

Q:有一只兔子,从第3个月开始每月生1只兔子,小兔子长到第3个月开始每个月也会生1只兔子,假如兔子都不死,问每个月的兔子总数是多少?

A:本题是一道典型的斐波那契数列问题,斐波那契数列定义如下:

 斐波那契数列,又称为黄金分割数列,在数学上,指如下被递推的数列定义:

F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)

按照递推公式,解决代码如下:

public class Fibonacci {
    public static void main(String[] args) {
        int sum_rabbit=1;//兔子总数
        int f1_rabbit=1;//两个月前的兔子总数
        int f2_rabbit=1;//一个月前的兔子总数
        for(int month=1;month<13;month++){
            if(month<3){
                sum_rabbit=1;
            }else {
                sum_rabbit=f1_rabbit+f2_rabbit;
                f1_rabbit=f2_rabbit;
                f2_rabbit=sum_rabbit;
            }
            System.out.println("第" + month + "个月" + sum_rabbit + "只兔子");
        }
    }
}

以上代码输出结果如下:

第1个月1只兔子
第2个月1只兔子
第3个月2只兔子
第4个月3只兔子
第5个月5只兔子
第6个月8只兔子
第7个月13只兔子
第8个月21只兔子
第9个月34只兔子
...

二、素数判断问题

Q:判断101~200之间有多少个素数,并将素数输出

A:素数的判断方式:一个数是否为素数的判断可将该数(m)被2~sqrt(m)除,均无法整除则可判定为素数。

 代码如下:

public class PrimeNumber {
    public static void main(String[] args) {
        int count=0;
        for(int i=101;i<=200;i++){
            boolean isPrime=true;
            for(int j=2;j<Math.sqrt(i);j++){
                if(i%j==0)
                    isPrime=false;
            }
            if(isPrime){
                count++;
                System.out.println("第"+count+"个素数为"+i);
            }
        }
        System.out.println("该范围内共有"+count+"个素数");
    }
}

以上程序输出结果为:

第1个素数为101
第2个素数为103
第3个素数为107
第4个素数为109
第5个素数为113
...
该范围内共有23个素数

三、水仙花数问题

Q:判断并输出101~999范围内所有的水仙花数

A:所谓的水仙花数是指一个三位数,其每一位的数字立方和等于该数本身,如153是一个水仙花数,因为153=1*1*1+5*5*5+3*3*3。因此,只需要将三位数进行数位数字的提取,分别取立方后求和即可判断该数是否为水仙花数。

代码如下:

public class NarcissusNumber {
    public static void main(String[] args) {
        for(int i=101;i<1000;i++){
            int number1=i%10;//个位数
            int number2=i/10%10;//十位数
            int number3=i/100;//百位数
            if((number1*number1*number1+number2*number2*number2+number3*number3*number3)==i)
                System.out.println(i);
        }
    }
}

输出结果如下:

153
370
371
407

四、正整数分解问题

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

A:对于一个正整数n,分解为质因数,应先找到一个最小质数k,然后按如下分解步骤分解:

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

 代码如下:

import java.util.Scanner;

public class IntegerFactorization {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int n=input.nextInt();
        int k=2;
        IntegerFactorization integerFactorization = new IntegerFactorization();
        integerFactorization.factorize(n,k);
    }
    public void factorize(int n,int k){
        while(k<=n){
            if(n==k){
                System.out.println(k);
                break;
            }else if(n%k==0){
                System.out.println(k);
                n=n/k;
            }else {
                k++;
            }
        }
    }
}

输入输出结果如下:

10
2
5

五、最大公约数与最小公倍数问题

Q:输入两个正整数m和n,求其最大公约数和最小公倍数。

A:最大公约数解法:欧几里得算法(辗转相除法

具体的步骤就是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后的除数就是这两个数的最大公约数。举个例子就是:比如两个数字,x=453,y=36;

453%36=21;

36%21=15;

21%15=6;

15%6=3;

6%3=0;

所以用这个算法可以求出453和36的最大公约数是3。

   最小公倍数解法:用两个数的乘积除以最大公约数即可。

代码如下:

import java.util.Scanner;

public class CommonDivisor {
    public static void main(String[] args) {
        Scanner input =new Scanner(System.in);
        int a=input.nextInt();
        int b=input.nextInt();
        CommonDivisor commonDivisor=new CommonDivisor();
        int i = commonDivisor.divisior(a, b);
        System.out.println("最大公约数"+i);
        System.out.println("最小公倍数"+a*b/i);
    }
    public int divisior(int a,int b) {
        if(a<b) {
            int t=b;
            b=a;
            a=t;
        }
        while(b!=0) {
            if(a==b)
                return a;
            int x=b;
            b=a%b;
            a=x;
        }
        return a;
    }
}

程序输入输出结果如下 :

9
6
最大公约数3
最小公倍数18

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值