Day3_深搜&if&完全平方&一年的第几天&三数排序

深搜

法一:

法二(深搜):

if

完全平方

一年的第几天

三数排序


深搜

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。

法一:

package Practice.T11;

public class T11 {
    public static void main(String[] args){
        int count = 0;
        int n = 0;
        for(int i=1;i<5;i++){
            for(int j=1;j<5;j++){
                if(j==i)
                    continue;
                for(int k=1;k<5;k++){
                    if(k!=i && k!=j){
                        n = i*100+j*10+k;
                        System.out.print(n+" ");
                        if((++count)%5==0)
                            System.out.println();
                    }
                }
            }
        }
        System.out.println();
        System.out.println("符合条件的数共:"+count+"个");
    }
}

法二(深搜):

package Practice.T11;

public class T11_dfs {
    static int[] a = new int[5];
    static int[] visit = new int[5];
    static int total = 0;
    static void dfs(int step)
    {
        int i;
        if(step == 4){
            for(int j = 1;j <= 3;j++){
                System.out.print(a[j]);
            }
            System.out.println();
            totaL++;
        }
        for(i = 1;i <= 4;i++){
            if(visit[i] == 0){
                a[step] = i;
                visit[i] = 1;
                dfs(step+1);
                visit[i] = 0;
            }
        }
    }
    public static void main(String[] args) {
        dfs(1);
        System.out.println("total=" + total);
    }
}

if

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

import java.io.*;
public class Prog12{
	public static void main(String[] args){
		System.out.print("请输入当前利润:");
		long profit = Long.parseLong(key_input());
		System.out.println("应发奖金:"+bonus(profit));
	}
	//接受从键盘输入的内容
	private static String key_input(){
		String str = null;
		BufferedReader bufIn = new BufferedReader(new InputStreamReader(system.in));
		try{
			str = bufIn.readLine();
		}catch(IOException e){
			e.printstacktrace();
		}finally{
			try{
				bufIn.close();
			}catch(IOException e){
				e.printstacktrace();
			}
		}
		return str;
	}
	//计算奖金
	private static long bonus(long profit){
		long prize = 0;
		long profit_sub = profit;
		if(profit>1000000){
			profit = profit_sub-1000000;
			profit_sub = 1000000;
			prize += profit*0.01;
		}
		if(profit>600000){
			profit = profit_sub-600000;
			profit_sub = 600000;
			prize += profit*0.015; 
		}
		if(profit>400000){
			profit = profit_sub-400000;
			profit_sub = 400000;
			prize += profit*0.03;
		}
		if(profit>200000){
			profit = profit_sub-200000;
			profit_sub = 200000;
			prize += prize*0.05;
		}
		if(profit>100000){
			profit = profit_sub-100000;
			profit_sub = 100000;
			prize += profit*0.075;
		}
		prize += profit_sub*0.1;
		return prize;
	}
}

完全平方

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足条件,即是结果。

这题答案写得很有意思:

package Practice.T13;

public class T13_2 {
    public static void main(String[] args){
        int n=0;
        for(int i=0;i<100001;i++){
            if(isCompSqrt_1(i+100) && isCompSqrt_1(i+268)){
                n = i;
                break;
            }
        }
        System.out.println("所求的数是:"+n);
    }
    //判断完全平方数
    private static boolean isCompSqrt_1(int n){
        boolean isComp_1 = false;
        for(int i=1;i<Math.sqrt(n)+1;i++){
            if(n==Math.pow(i,2)){
                isComp_1 = true;
                break;
            }
        }
        return isComp_1;
    }
}

输出是:

C:\Java\jdk-11.0.1\bin\java.exe "-javaagent:C:\Java\IntelliJ IDEA 2020.1\lib\idea_rt.jar=4636:C:\Java\IntelliJ IDEA 2020.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\zyn\Documents\JavaFiles\out\production\JavaFiles Practice.T13.T13_2
所求的数是:21

Process finished with exit code 0

我不禁怀疑了,真的只有一个值吗?

于是,我看向他的输出语句:

    for(int i=0;i<100001;i++){
            if(isCompSqrt_1(i+100) && isCompSqrt_1(i+268)){
                n = i;
                break;
            }
        }
        System.out.println("所求的数是:"+n);

怎么样,看着很《聪明》吧,还用了个break,找到符合值之后马上结束,省了好多时间。可是,你怎么知道就只有一个值?要知道,这里的break语句是直接跳出for循环的啊!这10000个数没有一一测试完怎么可以直接跳出?

应该这样输出

package Practice.T13;

import java.util.ArrayList;

//一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,10000以内
public class T13 {
    public static void main(String[] args){
        int count = 0;
        //ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i = 0;i <= 100000;i++){
            if(isCompSqrt(i+100) && isCompSqrt(i+268)){
//                list.add(i);
//                count++;
                System.out.println("所求的数是:"+i);
            }
        }
//        for(int i = 0;i < count;i++){
//            System.out.println("所求的数是:"+list.get(i));
//        }
    }
    private static boolean isCompSqrt(int n){
        boolean isComp = false;
        for(int i = 1;i < Math.sqrt(n) + 1;i++){
            if(n == Math.pow(i,2)){
                isComp = true;
                break;
            }
        }
        return isComp;
    }
}

其实我想复杂了,就是我想把这些符合要求的数存到一个数组里,然后输出。但是,我在声明数组的时候并不知道数组的长度,所以我用了可以任意添加数值的列表:

ArrayList<Integer> list = new ArrayList<Integer>();

具体操作见注释掉的代码

一年的第几天

题目:输入某年某月某日,判断这一天是这一年的第几天?

程序分析:以3月5日为例,应该先把前两个月的总天数加起来,然后再加上5天即本年的第几天。特殊情况,闰年且输入月份大于3时需考虑多加一天。

package Practice.T14;

import java.util.Scanner;

public class T14 {
    public static void main(String[] args){
        Scanner scan = new Scanner(system.in).useDelimiter("\\D");//匹配非数字
        System.out.print("请输入当前日期(年-月-日):");
        int year = scan.nextInt();
        int month = scan.nextInt();
        int date = scan.nextInt();
        scan.close();
        System.out.println("今天是"+year+"年的第"+analysis(year,month,date)+"天");
    }
    //判断天数
    private static int analysis(int year, int month, int date){
        int n = 0;
        int[] month_date = new int[] {31,28,31,30,31,30,31,31,30,30,30,31};
        if((year%400)==0 || ((year%4)==0)&&((year%100)!=0)){
            month_date[1] = 29;
        }
        for(int i = 0;i < month-1;i++)
            n += month_date[i];
        return n+date;
    }
}

三数排序

package Practice.T15;
//从小到大排序三数
import java.util.Scanner;

public class T15 {
    public static void main(String[] args){
        Scanner scan = new Scanner(system.in).useDelimiter("\\D");
        System.out.print("请输入三个数:");
        int x = scan.nextInt();
        int y = scan.nextInt();
        int z = scan.nextInt();
        scan.close();
        System.out.println("排序结果:"+sort(x,y,z));
    }
    //比较两个数的大小
    private static String sort(int x,int y,int z){
        String s = null;
        if(x>y){
            int t = x;
            x = y;
            y = t;
        }
        if(x>z){
            int t = x;
            x = z;
            z = t;
        }
        if(y>z){
            int t = z;
            z = y;
            y = t;
        }
        s = x+" "+y+" "+z;
        return s;
    }
}

更合理的做法是把“比较”封装

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...