深搜
题目:有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;
}
}
更合理的做法是把“比较”封装
原文地址:https://www.jb51.cc/wenti/3281555.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。