这篇文章就是主要做一些算法小练习用的
1.求机票价格
题目如下:
需求:机票价格按照淡旺季,头等舱经济舱来收费。输入机票原价,淡旺季,头等舱或经济舱来获取机票价格
规则如下:旺季(5-10)头等舱9折,经济舱8.5折;淡季(11-来年4月)头等舱7折,经济舱6.5折
代码如下:
public class Test1 {
/**
* 需求:机票价格按照淡旺季,头等舱经济舱来收费。输入机票原价,淡旺季,头等舱或经济舱来获取机票价格
* 规则如下:旺季(5-10)头等舱9折,经济舱8.5折;淡季(11-来年4月)头等舱7折,经济舱6.5折
*
* */
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入月份:");
int month = scanner.nextInt();
System.out.print("头等舱请输1,经济舱请输2:");
int a = scanner.nextInt();
System.out.print("请输入机票原价:");
double ticket = scanner.nextDouble();
if (month >= 5 && month <= 10 && a==1)
ticket = ticket * 0.9;
else if (month > 5 && month <= 10 && a==2)
ticket = ticket * 0.85;
else if (((month >= 11 && month <= 12) || (month <= 4 && month >= 1)) && a==1 )
ticket = ticket*0.7;
else if (((month >= 11 && month <= 12) || (month <= 4 && month >= 1)) && a==2 )
ticket = ticket*0.65;
System.out.println("机票价格为:"+ticket);
/** 写法二,就是将条件判断提取出来了
if (month >= 5 && month <= 10 && a==1)
ticket = ticket * 0.9;
else if (month > 5 && month <= 10 && a==2)
ticket = ticket * 0.85;
else if ((month >= 11 && month <= 12) || (month <= 4 && month >= 1) ){
if (a==1)
ticket = ticket*0.7;
else if (a == 2)
ticket = ticket*0.65;
}
*/
/**
错误写法:后面的两个else if的条件判断出现了问题
if (month >= 5 && month <= 10 && a==1)
ticket = ticket * 0.9;
else if (month >= 5 && month <= 10 && a==2)
ticket = ticket * 0.85;
else if ((month >= 11 && month <= 12) || (month <= 4 && month >= 1) && a==1 )
ticket = ticket*0.7;
else if ((month >= 11 && month <= 12) || (month <= 4 && month >= 1) && a==2)
ticket = ticket*0.65;
*/
}
}
结果如下:
解析:
这题很简单,但最开始还是出现了问题。重点就是注意条件判断,小括号的使用,或者使用分层来进行条件判断(等同于小括号的作用),条件较为复杂时,不要堆砌在一起。
拓展:
idea中,选中一块代码块,按Ctrl+Alt+M是自动提取方法
2.找质数
题目如下:
判断101~200之间有多少个素数,并输出所有的素数
代码如下:
public class Test2 {
public static void main(String[] args) {
int num = 99;
for (int i = 101; i < 200; i++) {
for (int j = 2; j < i; j++) {
if (i % j == 0) {
System.out.println(i + "不是一个质数");
num--;
break;
}
}
}
System.out.println("101~200间共有"+num+"个质数");
}
}
结果如下:
解析:
下面详细的说一下这题。
首先,求质数的方法。方法一:让该数除以2到(该数-1)的所有数,有余数为0的,那么它就不是质数,余数全都不为0,那么它就是质数。方法二:让该数除以2到该数的平方根的所有数,如果余数全都不为0,那么该数就位质数
上面代码有两点需要说明一下。第一点,为什么内层的 if 判断不用一个else?因为这是一个存在性问题,不是全都问题,一旦加上else,但凡有一个余数不为0,那么就要执行else下面的语句,这是不对的。第二点:在多层循环中,break是跳出自己所在层的循环,不是跳出全部循环。
3.生成随机验证码
题目如下:
需求:定义方法实现随机产生一个5位的验证码
验证码格式:长度为5;前四位为大写或小写字母;最后一位为数字
代码如下:
import java.util.Random;
public class Test3 {
public static void main(String[] args) {
char[] chs = new char[52];
for (int i = 0; i < chs.length; i++) {
if (i <= 25)
chs[i] = (char) (97 + i);
else
chs[i] = (char) (65 + i - 26);
}
String result = "";
Random r = new Random();
for (int i = 0; i < 4; i++) {
int randomIndex = r.nextInt(chs.length);
result = result + chs[randomIndex];
}
result = result + r.nextInt(10);
System.out.println(result);
}
}
结果如下:
解析:这题其实没啥好说的,就是一个用数组来存储字母,ASCII表,然后随机数,字符串拼接,就是这四点东西。但题目还是比较新颖有趣的
4.双色球系统
题目如下:
要求:用java进行模拟
代码如下:
import java.util.Random;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
//生成中奖号码
int[] arr = creatNumber();
//打印输出,方便测试
System.out.println("==================");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.println("==================");
//让用户输入彩票号码
int[] userArr = userInputNumber();
//判断中奖,记录蓝球和红球的个数
int redCount = 0;
int blueCount = 0;
//先遍历用户输入的
for (int i = 0; i < userArr.length-1; i++) {
//记录用户输入的
int redNumber = userArr[i];
//将用户输入的与中奖号码进行比对
for (int j = 0; j < arr.length-1; j++) {
//如果存在,那么红球数加1,并跳出循环,判断用户输入的下一个
if (redNumber == arr[j]){
redCount++;
break;
}
}
}
//判断蓝球的数量
int blueNumber = userArr[userArr.length-1];
if (blueNumber == arr[arr.length-1])
blueCount++;
//根据红篮球的数量来判断中奖等级
if (redCount == 6 && blueCount == 1) {
System.out.println("中1等将");
}else if (redCount == 6 && blueCount == 0){
System.out.println("中2等将");
}else if (redCount == 5 && blueCount == 1){
System.out.println("中3等将");
}else if ((redCount == 5 && blueCount == 0) || (redCount == 4 && blueCount == 1)){
System.out.println("中4等将");
}else if ((redCount == 4 && blueCount == 0) || (redCount == 3 && blueCount == 1)){
System.out.println("中5等将");
}else if ((redCount == 2 && blueCount == 1) || (redCount == 1 && blueCount == 1)|| (redCount == 0 && blueCount == 1)){
System.out.println("中6等将");
}else
System.out.println("未中奖");
}
//生成中奖号码
public static int[] creatNumber(){
//定义存储中奖号码的数组arr,6个红+1个蓝=7
int[] arr = new int[7];
Random r = new Random();
//生成红球号码并添加到数组中
for (int i = 0; i < 6; ) {
//生成随机数
int redNumber = r.nextInt(33)+1;
//判断新生成的数是否与数组中已添加的数重复
boolean flag = contains(arr,redNumber);
//如果不重复,就添加,此时索引才实现加1,即继续生成数组中的下一个数
if(!flag){
arr[i] = redNumber;
i++;
}
}
//生成蓝球号码
int blueNumber = r.nextInt(16)+1;
arr[arr.length-1] = blueNumber;
return arr;
}
//判断是否重复
public static boolean contains(int[] arr,int number){
for (int i = 0; i < arr.length; i++) {
//如果重复就返回true
if (arr[i] == number)
return true;
}
return false;
}
//用户输入号码
public static int[] userInputNumber(){
int[] arr = new int[7];
Scanner sc = new Scanner(System.in);
//输入红球号码
for (int i = 0; i < 6; ) {
System.out.println("请输入第"+(i+1)+"个号码");
int redNumber = sc.nextInt();
if (redNumber >=1 && redNumber <= 33){
boolean flag = contains(arr,redNumber);
//不相同,那么就是有效的
if (!flag){
arr[i] = redNumber;
i++;
}else
System.out.println("当前数字已存在,请重新输入!");
}else
System.out.println("号码超出范围!");
}
//输入蓝球号码
System.out.println("请输入蓝球号码:");
while (true) {
int blueNumber = sc.nextInt();
if (blueNumber >= 1 && blueNumber <= 16){
arr[arr.length-1] = blueNumber;
break;
}else
System.out.println("当前号码超出范围,请重新输入!");
}
return arr;
}
}
结果如下:
解析:这题其实难度一般,就是比较复杂,工程比较繁琐。具体思路可以看代码中的注释