Java核心技术卷1--抽彩游戏的数组快速排序
Posted R~567
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java核心技术卷1--抽彩游戏的数组快速排序相关的知识,希望对你有一定的参考价值。
题目为:抽彩是从多个数字中随机抽取几个不重复的值,进行排序输出且判断是否中奖。若中奖则输出中奖次数,若未中奖则给出提示。
输出结果示例:
代码可为:
package Three.NewLearn;
import java.util.Arrays;
import java.util.Scanner;
public class 抽彩游戏 {
public static void main(String[] args) {
int count = 0;
//定义一个计量数,计算中奖了几次
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要抽取数字的最高数:");
int n = sc.nextInt();
//设定一个n存放最高位数值
int n1 = n;
//定义了一个n1与n的数值相同
System.out.println("请输入您要抽取几个数字(1~"+n+"):");
int k = sc.nextInt();
//设定了抽取数
if(k>n){
System.out.println("对不起,您输入的数字不符合规范!");
//若此时抽取数比最高数要低则报错
}else{
int[] numbers = new int[n];
int[] numbers2 = new int[n1];
//定义了两个数组,其长度分别与n和n1相同
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i+1;
//对数组numbers进行从1~n的赋值;
}
for (int i = 0; i < numbers2.length; i++) {
numbers2[i] = i+1;
//对数组numbers2进行从1~n1的赋值;
}
int[] result = new int[k];
//定义了result数组使其长度等于抽取数k
for (int i = 0; i < result.length; i++) {
int r =(int) (Math.random()*n);
//此时的Math.random()*n为double类型需要强制转换为int类型。
result[i] = numbers[r];
//选择随机数numbers[r]赋值给result[i]
numbers[r] = numbers[n - 1];
n--;
//这里确保了不会再次抽取到同一个值
}
int[] winning = new int[k];
for (int i = 0; i < winning.length; i++) {
int w = (int) (Math.random()*n);
winning[i] = numbers2[w];
numbers2[w] = numbers2[n1 - 1];
n1--;
}
Arrays.sort(result);
//对数组进行排序
System.out.println("抽取完成,您抽取的数为:");
for(int r :result){
System.out.print(r+" ");
}
//使用foreach循环对数组进行遍历
System.out.println("");
//换行
Arrays.sort(winning);
System.out.println("中奖数为:");
for (int w:winning){
System.out.print(w+" ");
}
for (int x = 0; x < result.length; x++) {
for (int y = 0; y < winning.length; y++) {
if(result[x] == winning[y]){
count++;
}
}
}
//使用两个for循环且利用if语句对数组的值进行判断
//若有相同值则count计数值自增
System.out.println("");
if(count == 0){
System.out.println("对不起,您未中奖,请再接再厉!");
}else{
System.out.println("恭喜您,您中奖了"+count+"次");
}
}
}
}
介绍一下思路:
因为这个游戏是全程都要键盘输入所以我先定义了一个Scanner方法。
而抽彩游戏需要先定义它的范围,所以我定义了一个整形n去存储它的最高值,然后再定义一个整形k去存储我需要抽取的数量。那为什么还会有个n1=n呢?这个我们等等会讲到。
等输入完之后需要判断n和k的值,若n>k则没问题继续下面的程序,若n<k则不行,因为这里要抽取的值是不重复的而抽取出来的数量比它定义的范围还要大肯定是不行的,所以我们用if else语句进行判断。
接下来先定义一个数组numbers来存储抽彩的值,所以我将值1,2,3,···,n全部存储到数组numbers中,此时可以利用for循环对数组进行赋值。
而第三个数组result和第四个数组winning存放抽取出来的数,其中使用Math.random方法返回一个0~1之间(包含0、不包含1)的随机浮点数。此时使用n去乘这个浮点数,就可以得到从0~n-1之间的一个随机数,但是此时得到的还是浮点数,所以我用强制转换将浮点数转换为int类型且用一个变量r去存储这个随机数的值。
接下来就是重点了,如何解决重复这个问题呢?
这里我将result的第i个元素设置为numbers[r]存放的值,最初是r+1.
即:
result[i] = numbers[r];
若这样设置numbers数组的内容在每一次抽取之后都会发生变化。
所以我这里使用数组中的最后一个数覆盖numbers[r],并将n减1.
即:
numbers[r] = numbers[n-1];
n--;
其中的关键在于每次抽取的都是下标(索引),而不是实际的值。而下标指向数组中尚未抽取过的值。
而winning数组就不能再用n这个值,否则会出现两个数组抽取的值会永不相同,所以需要重新定义一个数组与一个变量来进行重新计数和抽取。至于抽取原理与上面相同。
在抽取过k个数之后,可以对result数组进行排序可以使用Arrays.sort()方法。
在最后使用两个for语句循环,进行判断两个抽取出来的数组中的值是否相同,若相同则计数的变量count进行自增。
最后输出结果。
以上是关于Java核心技术卷1--抽彩游戏的数组快速排序的主要内容,如果未能解决你的问题,请参考以下文章