Java基础经典10道题
目录
for循环的嵌套
题目一: 求101到200之间的素数的个数,并打印
代码分析:
注意点:
题目二:开发验证码
代码分析:
题目三:数组元素的复制
代码分析:
题目四:评委打分
健壮版代码:
代码分析:看源码
注意点:
题目五:数字加密
优化版代码:
代码分析:
题目六:数字解密
代码分析:
题目七:抢红包
优化版代码:
代码分析:
难点:
解释:
题目八:双色球彩票系统
运行结果:
代码分析:
题目九:
for循环的嵌套
题目一: 求101到200之间的素数的个数,并打印
代码:
package com.mohuanan.exercise;
public class ExerciseTest01 {
public static void main(String[] args) {
int count = 0;
for (int i = 101; i <= 200; i++) {
boolean flag = true;
for(int j = 2;j < i/2; j++){
if(i % j == 0){
flag = false;
break;
}
}
if(flag){
count++;
System.out.println(i+"是素数");
}
}
System.out.println("一共"+count+"个素数");
}
}
代码分析:
这里使用2个for循环,加上if条件判断标志flag是否为true,
注意点:
1.count应该放在if(flag)的里面,当flag为true是,这个数字就是素数
2.第二个for的j变量从2开始
题目二:开发验证码
代码:
package com.mohuanan.exercise;
import java.util.Random;
public class ExerciseTest02 {
public static void main(String[] args) {
//因为有52个字母(大小写)
char[] chs = new char[52];
for (int i = 0; i < chs.length; i++) {
if (i <= 25) {
//根据ASCII码
//录入大写字母
chs[i] = (char) (65 + i);//强制转化
} else {
//录入小写字母
chs[i] = (char) (97 - 26 + i);
}
}
String result = "";
//创建一个Random的对象
Random r = new Random();
for(int i = 0;i<4;i++){
//
int randomIndex = r.nextInt(52);
result = result + chs[randomIndex];
}
int number = r.nextInt(10);
result = result + number;
System.out.println(result);
}
}
代码分析:
1.定义了一个52的char类型的字符串,并用for循环根据ASCII码来给数组的元素赋值(大小写字母),创建了一个Random类,并使用nextInt()方法,进行四次循环,用来随机(大小为数组的长度)出来四个字母,赋值给String类型的变量result,之后再使用Random类中的nextInt()方法产生0到9的随机数,赋值给result
题目三:数组元素的复制
代码:
package com.mohuanan.exercise;
public class ExerciseTest03 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
int[] newArr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
//遍历输出
for (int i = 0; i < arr.length; i++) {
System.out.print(newArr[i]+" ");
}
//换行
System.out.println();
}
}
代码分析:
这个太简单了,可以自己看上面的代码,这里不再分析
题目四:评委打分
代码:
package com.mohuanan.exercise;
import java.util.Scanner;
public class ExerciseTest04 {
public static void main(String[] args) {
int sum = 0;
int[] arr = new int[6];
Scanner s = new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "个评委的分数");
arr[i] = s.nextInt();
sum += arr[i];
}
int max = arr[0];
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
if (min > arr[i]) {
min = arr[i];
}
}
float score = 0F;
score = (float) (sum - max - min) / (arr.length - 2);
System.out.println(score);
}
}
健壮版代码:
package com.mohuanan.exercise;
import java.util.Scanner;
public class ExerciseTest04 {
public static void main(String[] args) {
int sum = 0;
int[] arr = new int[6];
Scanner s = new Scanner(System.in);
for (int i = 0; i < arr.length; ) {
System.out.println("请输入第" + (i + 1) + "个评委的分数");
//判断 分数是否合法
int scoreArr = s.nextInt();
sum += arr[i];
if (scoreArr >= 0 && scoreArr <= 100){
arr[i] = scoreArr;
sum += arr[i];
i++;//注意i++放在这里
}else{
System.out.println("您之前输入的分数有误"+"请重新输入第" + (i + 1) + "个评委的分数");
}
}
int max = arr[0];
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
if (min > arr[i]) {
min = arr[i];
}
}
float score = 0F;
score = (float) (sum - max - min) / (arr.length - 2);
System.out.println(score);
}
}
代码分析:看源码
注意点:
1.score = (float) (sum - max - min) / (arr.length - 2);这里要加强制转化,如果不加,/运算符会截断数据,从而使结果错误
题目五:数字加密
代码:
package com.mohuanan.exercise;
import java.util.Scanner;
public class ExerciseTest05 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入您的密码");
int code = s.nextInt();
code = handle(code);
System.out.println(code);
}
public static int handle(int code) {
int result = 0;
int flag = 1;
while (code > 0) {
int temp;
temp = code % 10;
temp = (temp + 5) % 10;
result = result + temp * flag;
//result = result * 10 + temp;// reversedNumber = reversedNumber * 10 + digit; // 将最后一位数字添加到反转数字的末尾
code /= 10;
flag *= 10;
}
result = reversalNum(result);
return result;
}
//数字反转
public static int reversalNum(int code) {
int result =0;
while (code > 0) {
int temp;
temp = code % 10;
result = result * 10 + temp;
code /= 10;
}
return result;
}
}
优化版代码:
package com.mohuanan.exercise;
public class ExerciseTest06 {
public static void main(String[] args) {
int number = 1983;
//为后面的下面使用number的值
int temp = number;
int count = 0;
//计算数字的长度
while (number != 0) {
count++;
number /= 10;
}
//定义一个数组
int[] arr = new int[count];
//把数字上的每一位复制到数组中
while (temp != 0) {
arr[--count] = temp % 10;
temp = temp / 10;
}
//每位数加上5 并对10求余
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] + 5;
arr[i] = arr[i] % 10;
}
//所有数字反转
for (int i = 0;i<arr.length/2; i++) {//arr.length/2 是把它看成一半
int t;
t = arr[i];
arr[i] = arr[arr.length-1-i];//-1是索引 -i是
arr[arr.length-1-i] = t;
}
//拼接
int newNumber = 0;
for (int i = 0; i < arr.length; i++) {
newNumber = newNumber*10 + arr[i];
}
//输出打印
System.out.println(newNumber);
}
}
代码分析:
题目六:数字解密
代码:
package com.mohuanan.exercise;
public class ExerciseTest07 {
public static void main(String[] args) {
int[] arr = {8, 3, 4, 6};
//反转
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {//注意这里的循环条件 是 i<j 相当于左右指针
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//由于之前是加密 余10 +5 所以要判断 并-5
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= 0 && arr[i] <= 4) {
arr[i] = arr[i] + 10;
}
arr[i] = arr[i] - 5;
}
//拼接
int number = 0;
for (int i = 0; i < arr.length; i++) {
number = number * 10 + arr[i];
}
//输出
System.out.println(number);
}
}
代码分析:
1.反转数字使用两个指针,循环条件i<j,使用临时变量,作为两个数的交换
2.由于数字的范围只能是5到14(因为一个一位数子加上5的范围,0+5到9+5),所以判断当前数字为0到4时就加上10,
3.根据数组的长度来拼接number = number*10+arr[i]
题目七:抢红包
代码:
package com.mohuanan.exercise;
import java.util.Random;
public class ExerciseTest08 {
public static void main(String[] args) {
//数组奖池
int[] arr = {2, 588, 888, 1000, 10000};
//定义新数组 用于存储抽奖的结果
int[] newArr = new int[arr.length];
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int index = r.nextInt(arr.length);
int prize = arr[index];
while(contains(newArr,prize)){
index = r.nextInt(arr.length);
prize = arr[index];
}
newArr[i] = prize;
}
//遍历输出
for (int i = 0; i < newArr.length; i++) {
System.out.println("第"+(i+1)+"个抽出的是"+newArr[i]);
}
}
//用于判断奖池是否存在
public static boolean contains(int[] arr, int prize) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == prize) {
return true;
}
}
return false;
}
}
优化版代码:
package com.mohuanan.exercise;
import java.util.Random;
public class ExerciseTest09 {
public static void main(String[] args) {
int[] arr = {2, 588, 888, 1000, 10000};
//打乱数组里的元素
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//根据 i 和 随机索引 进行交换
int temp;//临时变量
int randomIndex = r.nextInt(arr.length);//注意这里要给一个范围 arr.length 因为是从0开始的 所以0 1 2 3 4
temp = arr[i];
arr[i] = arr[randomIndex];
arr[randomIndex] = temp;
}
//遍历输出
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
代码分析:
1.使用Random对象中的nextInt()方法,打乱数组的元素,根据i索引于随机索引进行交换
2.相比于上面的代码,少了(假设到了最后的一个数字,要一直索引,直到arr数组里的元素不与索引的相同)
难点:
1.有些人可能会疑惑,为什么这样子可以打乱数组的元素,
解释:
交换两个数字,数组中的元素,没有改变,改变的只是数组的元素的位置,但是数组的元素还是原来的那几个,
题目八:双色球彩票系统
代码:
package com.mohuanan.exercise;
import java.util.Random;
import java.util.Scanner;
public class ExerciseTest010 {
public static void main(String[] args) {
//1.生成中奖号码
int[] arr = createNumber();
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
//2.用户输入号码
int[] peopleArr = peopleInputNumber();
//3.计算获奖情况
//中奖的个数
int redCount = 0;
int blueCount = 0;
//计算中红色球的个数 要长度-1
for (int i = 0; i < arr.length-1; i++) {
for(int j = 0;j<peopleArr.length-1;j++){
//找到就 红色球+1 并退出循环,避免没有必要的运算
if(arr[i]==peopleArr[j]){
redCount++;
break;
}
}
}
//计算中蓝色球的个数
if(arr[arr.length-1]==peopleArr[peopleArr.length-1]){//注意是下标 所以-1
blueCount++;
}
//根据红蓝球的个数 判断获奖情况
switch(redCount){
case 6:
if(blueCount==1){
System.out.println("恭喜你获得1000万 但是这是虚拟的 不要沉迷于");
}else if(blueCount == 0){
System.out.println("恭喜你获得500万 但是这是虚拟的 不要沉迷于");
}
break;
case 5:
if(blueCount==1){
System.out.println("恭喜你获得3000元 但是这是虚拟的 不要沉迷于");
}else if(blueCount == 0){
System.out.println("恭喜你获得200元 但是这是虚拟的 不要沉迷于");
}
break;
case 4:
if(blueCount==1){
System.out.println("恭喜你获得3000元 但是这是虚拟的 不要沉迷于");
}else if(blueCount == 0){
System.out.println("恭喜你获得10元 但是这是虚拟的 不要沉迷于");
}
break;
case 3:
if(blueCount==1){
System.out.println("恭喜你获得10元 但是这是虚拟的 不要沉迷于");
}
break;
case 2:
case 1:
if(blueCount==1){
System.out.println("恭喜你获得5元 但是这是虚拟的 不要沉迷于");
}
break;
default :
System.out.println("没中,再接再厉,下次再买,才怪,不要再买了");
}
}
//用户输入号码
public static int[] peopleInputNumber(){
//动态定义一个数组
int[] arr = new int[7];
Scanner sc = new Scanner(System.in);
//用户录入6个红球
for (int i = 0; i < arr.length-1; ) {
boolean flag = false;
System.out.print("请输入您的第"+(i+1)+"个红球号码");
int redNumber = sc.nextInt();
// 如果录入的数字不存在就赋值 注意数字的范围(1-33)
if((!judgeNumber(arr,redNumber)) && (redNumber>=1 && redNumber <=33)){
arr[i] = redNumber;
i++;//录入新的数字才 i++ 即录入下一个数字
flag = true;
}
if(flag==false){
System.out.print("您输入的号码出错");
}
}
//用户录入蓝球
System.out.print("请输入您的蓝球号码:");
int blueNumber = sc.nextInt();
// 注意数字的范围(1-16)
if(blueNumber>=1 && blueNumber <=16){
arr[arr.length-1] = blueNumber;
}else{
while(true){
System.out.print("您的号码超出范围 请重新输入:");
blueNumber = sc.nextInt();
if(blueNumber>=1 && blueNumber <=16){
arr[arr.length-1] = blueNumber;
break;
}
}
}
return arr;
}
//生成中奖号码
public static int[] createNumber() {
//创建一个动态长度为7的数组
int[] arr = new int[7];
Random r = new Random();
//红球号码
for (int i = 0; i < arr.length - 1; ) {//因为6个红球 一个蓝 所以-1
int redNumber = r.nextInt(33) + 1;//这里加1 使范围从 1到33
//如果存在 就再 随机
//如果不存在 就赋值 并 i++
if (!judgeNumber(arr, redNumber)) {
arr[i] = redNumber;
i++;// 赋值后再i++ 注意i++放在这里 这是新的数字 才让 i++
}
}
//蓝球号码
int blueNumber = r.nextInt(16) + 1;
arr[arr.length-1]= blueNumber;
return arr;
}
//判断是否存在
public static boolean judgeNumber(int[] arr, int redNumber) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == redNumber) {
return true;
}
}
return false;
}
}
运行结果:
代码分析:
1. 根据需求,解决问题,分为3个步骤,
1.1 生成一个获奖的代码,方法: 使用Random对象,动态创建一个长度为7(6红1蓝)的数组,当随机产生的数字要在范围内(红:1-33 蓝:1-16),并判断当前的数字在数组中是否存在,如果不存在,就将当前数字赋值到数组里,并i++,使将6个红球都赋值到数组里,最后再将蓝球号码赋值到数组的最后一个元素
1.2 用户录入他的号码,方法: 动态创建一个长度为7(6红1蓝)的数组,使用Scanner对象,将用户录入的数字赋值到数组里面,(当随机产生的数字要在范围内(红:1-33 蓝:1-16),并判断当前的数字在数组中是否存在,如果不存在,就将当前数字赋值到数组里)使用while(true)使代码的健壮性更好,当用户输入的数字正确时,break,跳出循环
1.3 定义redCount,blueCount,使用两个for计算中奖的红蓝球的个数,再根据中奖的红蓝球的个数,使用switch和if的嵌套来得出用户中奖的情况
2. 为了使代码更加的"好",可以增加一些注释和提高代码执行的效率,为了便于以后的维护,变量名和方法名一定要用通俗易懂的命名规则(驼峰原则) ,
题目九:买飞机票
代码:
package com.mohuanan.exercise;
import java.util.Scanner;
public class ExerciseDemo03 {
public static void main(String[] args) {
//创建一个Scanner对象
Scanner sc = new Scanner(System.in);
//原来票价
System.out.println("请输入您的票价");
int ticket = sc.nextInt();
//月份
System.out.println("请输入您的月份");
int month = sc.nextInt();
//舱位
System.out.println("请输入您的舱位,0 头等舱 1经济舱");
int seat = sc.nextInt();
//旺季
if(month >= 5 && month <= 10){
//头等舱
if(seat == 0){
ticket = (int)(ticket * 0.9);//数据类型强制转化
}else if(seat == 1){
ticket = (int)(ticket * 0.85);
}else{
System.out.println("没有这个舱位");
}
//淡季
}else if((month >= 1 && month <= 4) || month >= 11 && month <= 12){
if(seat == 0){
ticket = (int)(ticket * 0.7);//数据类型强制转化
}else if(seat == 1){
ticket = (int)(ticket * 0.65);
}else{
System.out.println("没有这个舱位");
}
}else{
System.out.println("抱歉,您输入的月份不对");
}
System.out.println(ticket);
}
}
代码分析:
使用了if条件的嵌套,逐步细化问题,
题目十:二维数组
代码:
package com.mohuanan.exercise;
public class ExerciseTest012 {
public static void main(String[] args) {
//静态定义一个二维数组
int[][] yearArrArr = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12}
};
//计算一年的和
int yearSum = 0;
for (int i = 0; i < yearArrArr.length; i++) {
//int[] quarteArr = yearArrArr[i];
int sum = getSum(yearArrArr[i]);
System.out.println("第" + (i + 1) + "个季度和为" + sum);
yearSum = yearSum + sum;
}
System.out.println("一年的和为"+yearSum);
}
//求每一个季度的销售额
public static int getSum(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum = sum + arr[i];
}
return sum;
}
}
代码分析:
1.静态定义一个二维数组,使用getSum()方法求每一个季度的和,并返回给sum
2.使用一个for循环,求每一个季度的和,并定义一个yearSum的变量存储一年的和,每一次循环把每一个季度的和赋值给yearSum,并累加
目录
for循环的嵌套
题目一: 求101到200之间的素数的个数,并打印
代码分析:
注意点:
题目二:开发验证码
代码分析:
题目三:数组元素的复制
代码分析:
题目四:评委打分
健壮版代码:
代码分析:看源码
注意点:
题目五:数字加密
优化版代码:
代码分析:
题目六:数字解密
代码分析:
题目七:抢红包
优化版代码:
代码分析:
难点:
解释:
题目八:双色球彩票系统
运行结果:
代码分析:
题目九:买飞机票
代码分析:
题目十:二维数组
代码分析: