Java经典算法(一)

【程序1】

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问某个月的兔子总数为多少?
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21…,为Fibonacci数列(斐波那契数列)。
1.使用递归求解:
解题代码:

import java.util.*;
public class Test1{
    public static void main(String args[]){
    while(true){
    int yueshu=new Scanner(System.in).nextInt();
    System.out.println("您好:第"+yueshu+"个月的兔子数为:"+f(yueshu)+"对。");}}
    public static int f(int x){
        if(x==1 || x==2)
            return 1;
        else
    return f(x-1)+f(x-2);}
}

代码运行结果如下图所示:在这里插入图片描述

注意:除经典算法外,我还整理了十套最新Java架构项目实战教程+大厂面试题库,想学的 点击此处获取,没基础勿进!

2.使用循环
解题代码:

import java.util.*;
public class Test1$1{
    public static void main(String args[]){
    Scanner read=new Scanner(System.in);
    while(true){
    int yueshu=read.nextInt();
        int sum=1,oldsum=0,temp=0;
        for(int i=0;i<yueshu-1;i++){
                oldsum=sum;
                sum+=temp;
                temp=oldsum;}
        System.out.println("您好:第"+yueshu+"个月的兔子数为:"+sum+"对。");}
        }
}

程序运行结果:
在这里插入图片描述
总结:
1.在方法1中,由于键盘录将Scanner方法两行代码写为一行,虽然看着简洁,减少了代码量,但是,在while中每次循环都会录入月数时都会new 一个Scanner对象,造成额外的资源消耗。
2.方法一使用递归,有可能会造成内存溢出,对内存要求高,而方法二使用循环可以有效的避免这个问题。

焦点关注:

那么问题来了!!!
众所周知,因不以兔的意志为转移的且不可抗拒的因素存在,近亲(三代以内的直系、旁系亲属)结婚非法,是不能领证的。所以产生一个问题:兔子家族世世代代需要如此苟且而没有诗和远方吗?

No!!!

可以预见,在许久的将来,兔子家族中的非近亲的兔子可以两两成对,全员领证。假如非要给这个时间加上一个期限,最少是多久呢?
经过多久以后,兔子家族的兔子夫妻们可以领结婚证而不犯法呢?

求大神解答???

求大神解答???

求大神解答???

【程序2】

题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

public class Test2{
	public static void main(String[] args){
		int i=0,x=0;
	while(x<5){
	i++;
	int q=i;
	for(int y=0;y<5;y++){
	if(--q%5==0){
	x++;
    q=q*4/5;
        }
	} 
		if(x==5){
		System.out.println(i);
		}else{x=0;}
	}}
}

下图为程序运行结果:
在这里插入图片描述

【程序3】

题目:一个多位数,判断它是不是回文数。如12321是回文数,个位与万位相同,十位与千位相同。
以下为我的解题代码:

import java.util.Scanner;
public class test3 {
    public static void main(String[] args) {
    Scanner input =new Scanner(System.in);
    while(true){
        StringBuffer number=new StringBuffer(input.nextLine());
        String left=number.toString();
        String right=number.reverse().toString();
        //System.out.println(left);
    	//System.out.println(right);
		if (left.contains(right)){          //or if(left.equals(right))
            System.out.println("Good luck,the number you entered:"+left+"is palindrome" );}
        else{
            System.out.println("Sorry,the number you entered:"+left+"is not palindrome");}
       }}
}

程序运行结果如下图所示:
在这里插入图片描述

【程序4】

题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
解题代码:

import java.util.*;
public class Test4 {
    public static void main(String[] args) {
        Scanner read=new Scanner(System.in);
        int a,b,c;
        while(read.hasNext()){
            int N=read.nextInt();
        for(int i=104;i<N&&i<1000;i++) {
            a=i%10;
            b=i/10%10;
            c=i/100;
            if(a*a*a+b*b*b+c*c*c==i)
            System.out.println("符合条件的数:"+i);
        }
    }
    }
} 

程序运行结果:
在这里插入图片描述

【程序5】

题目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
解题代码:

import java.util.*;
public class Test5 {
    public static void main(String[] args) {
        Scanner read=new Scanner(System.in);
        while(read.hasNext()){
            int a=read.nextInt(),n=read.nextInt();
            if(a>9||n>9){
                System.out.println("Sorry,xiaode'ability is too small to process the numbers you enter!!!");
            }else{
            StringBuffer s=new StringBuffer("s=");
        long sum=0,b=0;
        for(int i=0;i<n;i++) {
            b+=a;
            sum+=b;
            a=a*10;
            s.append(b+"+");
        }
            System.out.println(s.deleteCharAt(s.length() - 1).append("="+sum));}
    }}
}

程序运行结果:
在这里插入图片描述

【程序6】

题目:判断n~m之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),为最少除循环次数,如果能被整除, 则表明此数不是素数,反之是素数。
解题代码:

import java.util.*;
public class Test6 {
    public static void main(String[] args) {
        Scanner read=new Scanner(System.in);
        while(read.hasNext()){
            int x=read.nextInt(),y=read.nextInt();
            if(x>y){
                y+=x;
                x=y-x;
                y-=x;}
            panduansushu(x,y);}}
        public static void panduansushu(int x,int y){
        int count=0;
        if(x<=2&&y>=2){
            System.out.print("  素数"+(++count)+":"+2);////此处使用i+2,而不是i++,循环次数几乎减半,提高效率,优化代码
        }
        if(x%2==0)x++;
        for(int i=x;i<=y;i+=2) {
            boolean flag=true;
            for(int j=2;j<=Math.sqrt(i);j++) {
                if(i%j==0) {
                    flag=false;
                    break;
                }
            }
            if(flag==true) {
                System.out.print("  素数"+(++count)+": "+i);
            }
        }
        System.out.println('\n'+"你好:"+x+"~"+y+"之间的素数数量为:"+count);
    }
}

程序运行结果:
在这里插入图片描述
总结:特殊情况,2是素数也是偶数,是唯一一个是偶数的素数,因此需要单练,除此之外,所有偶数应在for循环判断是否素数之前(外)排除,不应该循环内判断是否偶数,否则每次循环都将判断,效率不佳,提高程序效率,近乎将循环次数减半。
判断素数的方法:用一个数分别去除2到sqrt(这个数),为最少循环次数,如果能被整除, 则表明此数不是素数,反之是素数。

【程序7】

题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
**解题代码:**程序运行结果:

import java.util.*;
public class Test7 {
    public static void main(String[] args) {
        Scanner read=new Scanner(System.in);
        while(read.hasNext()){
        int score=read.nextInt();
        char grade=score>=90?'A':score>=60?'B':'C';
        System.out.println("得分为"+score+"的同学,你的评级为"+grade);
        }
    }
}

程序运行结果:
在这里插入图片描述

【程序8】

题目:一球从H米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第n次落地时,共经过多少米?会反弹多高?
解题代码:

import java.util.*;
public class Test8 {
    public static void main(String[] args) {
        while(true){
        Scanner read=new Scanner(System.in);
        System.out.println("请输入高度H(米),次数n");
        int H=read.nextInt(),n=read.nextInt();
        System.out.println("第"+n+"次会反弹"+(double)H/(2<<(n-1))+"米高");  
        fangfa(H,n);
    }}
        public static void fangfa(int H,int n){
            int s=H;
            for(int i=1;i<n;i++){
                H=H/2;
                s+=2*H;
            }
        System.out.println("移动的总路程为:"+s);
    }
}

程序运行结果:
在这里插入图片描述

【程序9】

题目:有1、2、3、4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?并把他们都输入。
解题代码

class Test9 {
    public static void main(String[] args) {
        int count=0;
        for(int i=1;i<5;i++) {
            for(int j=1;j<5;j++) {
                for(int k=1;k<5;k++) {
                    if(i!=j&&j!=k&&i!=k) {
                        System.out.println("正在打印第"+(++count)+"个数字:"+(i*100+j*10+k));
                    }
                }
            }
        }
        System.out.println("总共有"+count+"个数符合条件。");
    }
}

程序运行结果:
在这里插入图片描述
注意:除经典算法外,我还整理了十套最新Java架构项目实战教程+大厂面试题库,想学的 点击此处获取,没基础勿进!

路阻且长之Java学习:

API中的重要类(一):
https://blog.csdn.net/Veer_c/article/details/103803248
API中的重要类(二):
https://blog.csdn.net/Veer_c/article/details/103807515
API中的重要类(三):
https://blog.csdn.net/Veer_c/article/details/103808054

Java中的IO流(一):
https://blog.csdn.net/Veer_c/article/details/103833045
Java中的IO流(二):
https://blog.csdn.net/Veer_c/article/details/103833423
Java中的IO流(三):
https://blog.csdn.net/Veer_c/article/details/103833811

Java多线程(一):
https://blog.csdn.net/Veer_c/article/details/103842078
Java多线程(二):
https://blog.csdn.net/Veer_c/article/details/103842263
Java多线程(三):
https://blog.csdn.net/Veer_c/article/details/103842317
Java多线程(四):
https://blog.csdn.net/Veer_c/article/details/103842602

网络编程上(UDP):
https://blog.csdn.net/Veer_c/article/details/103843591
网络编程下(TCP):
https://blog.csdn.net/Veer_c/article/details/103843825

MySQL数据库(一):
https://blog.csdn.net/Veer_c/article/details/103844059
MySQL数据库(二):
https://blog.csdn.net/Veer_c/article/details/103844537
MySQL数据库(三):
https://blog.csdn.net/Veer_c/article/details/103844739

JDBC技术(一):
https://blog.csdn.net/Veer_c/article/details/103845176
JDBC技术(二):
https://blog.csdn.net/Veer_c/article/details/103879890
JDBC技术(三):
https://blog.csdn.net/Veer_c/article/details/103880021
JDBC技术(四):
https://blog.csdn.net/Veer_c/article/details/103882264

HTML的基础框架(一):
https://blog.csdn.net/Veer_c/article/details/103882385
HTML的基础框架(二):
https://blog.csdn.net/Veer_c/article/details/103882684

CSS入门(一)
https://blog.csdn.net/Veer_c/article/details/103882856

CSS入门(二):
https://blog.csdn.net/Veer_c/article/details/103883102

JavaScript实用案例与常见问题(一):
https://blog.csdn.net/Veer_c/article/details/103894959
JavaScript实用案例及常见问题(二):
https://blog.csdn.net/Veer_c/article/details/103895166

BOM编程详解:
https://blog.csdn.net/Veer_c/article/details/103895433

猜你喜欢

转载自blog.csdn.net/Veer_c/article/details/106194187