Java语言基础编程练习(2)
编程题1
- 提示用户输入年月日信息,判断这一天是这一年中的第几天并打印。
解题思路:
- 提示用户输入年月日的信息,根据输入年份判断是平年还是闰年,平年2月28天,闰年2月29天
- 使用两个一维数组来分别记录平年和闰年每个月的天数
- 用户输入日的数值加上之前月份的总天数则为当前这一天在这一年中的总天数
System.out.println("请输入年:");
Scanner scanner = new Scanner(System.in);
int year = scanner.nextInt();
System.out.println("请输入月:");
int month = scanner.nextInt();
System.out.println("请输入日:");
int day = scanner.nextInt();
//新建两个一维数组分别记录平年和闰年每个月的天数
int[] common_year = {31,28,31,30,31,30,31,31,30,31,30,31};
int[] leap_year = {31,29,31,30,31,30,31,31,30,31,30,31};
int sum = 0;
//判断用户输入的年份是平年还是闰年
if ((year%4 ==0 && year%100 != 0) || (year%100 == 0 && year%400 == 0)){
for (int i = 0; i < month-1; i++) {
sum += leap_year[i];
}
}else {
for (int i = 0; i < month-1; i++) {
sum += common_year[i];
}
}
System.out.println(year+"-"+month+"-"+day+"是这一年中的第"+(sum+day)+"天");
编程题2
-
编程找出 1000 以内的所有完数并打印出来。
所谓完数就是一个数恰好等于它的因子之和,如:6=1+2+3
解题思路:
- 找到这个数的所有因子,其中1和其本身必定为因子
- 循环遍历找到能被该数整除的因子并记录
- 判断除去该数本身的其他因子的和是否等于该数
int sum;
for (int i = 1; i <= 1000; i++) {
sum = 0;
for (int j = 1; j < i; j++) {
if(i%j == 0){
sum += j;
}
}
if (sum == i){
System.out.println(i);
}
}
编程题3
-
实现双色球抽奖游戏中奖号码的生成,中奖号码由 6 个红球号码和 1 个蓝球号码组成。
其中红球号码要求随机生成 6 个 1~33 之间不重复的随机号码。
其中蓝球号码要求随机生成 1 个 1~16 之间的随机号码。
解题思路:
- 使用一个一维数组来记录中奖的7个号码
- 红球的6个号码为1~33之间不重复的随机号码,每次生成的随机号码都需要与数组中的号码比较
int[] arr = new int[7];
//为红球随机生成号码
Random r = new Random();
int num;
int[] arr1 = new int[7];
for (int i = 0; i < 6; i++) {
Arrays.sort(arr1);
inner: while (true) {
num = r.nextInt(33) + 1;
if (Arrays.binarySearch(arr1, num) < 0) {
arr[i] = num;
break inner;
}
}
System.arraycopy(arr,0,arr1,0,6);
}
arr[6] = r.nextInt(16)+1;
System.out.println(Arrays.toString(arr));
编程题4
-
自定义数组扩容规则,当已存储元素数量达到总容量的 80%时,扩容 1.5 倍。
例如,总容量是 10,当输入第 8 个元素时,数组进行扩容,容量从 10 变 15。
解题思路
- 声明一个变量用来记录当前存入数组中的元素个数
- 当达到总容量80%时扩容1.5倍并将其之前的数组拷贝到新的数组中
- 当使用移位运算符>>表示0.5倍的时候,需要使用小括号括起来
System.out.println("初始化一个长度为n的数组:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
int[] arr1 = new int[n];
//声明一个计数变量用来记录当前放入数组中的元素个数
int count = 0;
int num;
String flag;
outer: while (true) {
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入放入的元素:");
num = scanner.nextInt();
arr[i] = num;
count++;
if (count >= arr.length*0.8){
arr1 = new int[arr.length+(arr.length>>1)];
System.arraycopy(arr,0,arr1,0,count);
arr = new int[arr.length+(arr.length>>1)];
System.arraycopy(arr1,0,arr,0,count);
}
System.out.println("是否继续输入? y/n");
flag = scanner.next();
if (flag.equals("n")){
System.out.println("当前数组长度为"+arr.length+"当前数组元素为"+ Arrays.toString(arr));
break outer;
}
}
}