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;
}
}
}