2018.3.25
Java基础50题系列源码已上传到我的github仓库,有需要的可以自取,欢迎大家提出建议
https://github.com/Lawliet0717/Java-foudamental-50-problems
第21题
题目:求1+2!+3!+…+20!的和
思路:先写一个函数递归求阶乘,再循环求和
package Java基础50题;
/*
* Lawliet.2018.3.23
*/
/*
* 求1+2!+3!+...+20!的和
*/
public class example_21 {
public static long fac(int n){
if(n == 1 ){
return 1;
}
return n * fac(n - 1);
}
public static void main(String[] args){
long res = 0;
for(int i = 1; i <=20; i++){
res += fac(i);
}
System.out.println(res);
}
}
第22题
题目:利用递归方法求5!
思路:上面已经写过递归求阶乘了
第23题
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。 问第4个人岁数,他说比第3个人大2岁。 问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
思路:还是递归,不要想着去倒推,这题就是练递归的
package Java基础50题;
/*
* Lawliet.2018.3.23
*/
/*
* 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。
* 问第4个人岁数,他说比第3个人大2岁。
* 问第三个人,又说比第2人大两岁。
* 问第2个人,说比第一个人大两岁。
* 最后问第一个人,他说是10岁。请问第五个人多大?
*/
public class example_23 {
public static int fun(int n){
if(n == 1){
return 10;
}
return 2 + fun(n - 1);
}
public static void main(String[] args){
int n = 5;
int res = fun(n);
System.out.println(res);
}
}
第24题
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
思路:把输入的正整数转为String类型进行操作。用.length()返回长度,用.substring() 逆序打印,注意一下.substring() 是左闭右开的。
package Java基础50题;
import java.util.*;
/*
* Lawliet.2018.3.23
*/
/*
* 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
*/
public class example_24 {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("请输入一个正整数:");
String str = in.nextLine();
System.out.println("这个数是" + str.length() + "位数");
System.out.println("这个数的逆序是:");
for(int i = str.length() - 1; i >= 0; i--){
System.out.print(str.substring(i, i+1));//substring是左闭右开的
}
}
}
第25题
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
思路:还是转成String。找出mid,从前往后,从后往前比对是否相等。如果是字母的话仍然使用。
package Java基础50题;
import java.util.*;
/*
* Lawliet.2018.3.23
*/
/*
* 一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
*/
public class example_25 {
public static void main(String args[]){
Scanner in = new Scanner(System.in);
System.out.println("请输入一个n位数:");
String str = in.nextLine();
char[] arr = str.toCharArray();
boolean flag = true;
int length = arr.length;
int mid = (int) arr.length / 2 ;
System.out.println(mid);
for(int i = 0; i < mid; i++){
if(arr[i] != arr[length - 1 - i]){
flag = false;
}
}
if(flag == true){
System.out.println("是回文");
}else{
System.out.println("不是回文");
}
}
}
第26题
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
思路:switch写一个判断,首字母一样的再判断第二个
package Java基础50题;
import java.util.*;
/*
* Lawliet.2018.3.23
*/
/*
* 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
*
*/
public class example_26 {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String str = in.nextLine();
char[] ch = str.toCharArray();
switch(ch[0]){
case 'M':{
System.out.println("星期一");
break;
}
case 'T':{
if(ch[1] == 'u'){
System.out.println("星期二");
}else{
System.out.println("星期四");
}
break;
}
case 'W':{
System.out.println("星期三");
break;
}
case 'F':{
System.out.println("星期五");
break;
}
case 'S':{
if(ch[1] == 'a'){
System.out.println("星期六");
}else{
System.out.println("星期日");
}
break;
}
}
}
}
第27题
题目:求100之内的素数
思路:前面做过了,直接把函数拿来用
package Java基础50题;
/*
* Lawliet.2018.3.24
*/
/*
* 求100之内的素数
*/
public class example_27 {
public static void main(String args[]){
int factor = 0;
int num = 0;
for(int i = 1; i <= 100; i++){
for(int j = 1; j <= i; j++){
if(i % j == 0){
factor++;
}
}
if(factor == 2){
num++;
System.out.print(i + " ");
}
factor = 0;
}
System.out.println();
System.out.println("100以内一共有 " + num + "个素数" );
}
}
第28题
题目:对10个数进行排序
思路:写了个简单的冒泡排序,时间复杂度是O(n²)
package Java基础50题;
import java.util.Arrays;
import java.util.*;
/*
* Lawliet.2018.3.24
*/
/*
* 对10个数进行排序
*/
public class example_28 {
public static void bubbleSort(int arr[]){
if(arr == null ||arr.length<2){
return;
}
for(int e = arr.length-1; e > 0; e--){
for(int i = 0; i < e; i++){
if(arr[i] > arr[i+1] )
swap(arr, i, i+1);
}
}
}
public static void swap(int arr[], int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("请输入数组长度:");
while(in.hasNext()){
int len = in.nextInt();
int[] arr = new int[len];
System.out.println("请输入数组:");
for(int i = 0; i < len; i++){
arr[i] = in.nextInt();
}
bubbleSort(arr);
printArray(arr);
}
}
}
第29题
题目:求一个3*3矩阵对角线元素之和
思路:没什么难的,熟悉一下怎么输入二维数组
package Java基础50题;
import java.util.*;
/*
* Lawliet.2018.3.24
*/
/*
* 求一个3*3矩阵对角线元素之和
*/
public class example_29 {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("请输入数组的行数和列数:");
int m = in.nextInt();
int n = in.nextInt();
int[][] arr = new int[m][n];
System.out.println("请输入数组");
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
arr[i][j] = in.nextInt();
}
}
int sum = 0;
for(int i = 0; i < m; i++){
sum += arr[i][i];
}
System.out.println("对角线之和为:" + sum);
}
}
第30题
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
思路:用Arraylist来实现,熟悉一下Arraylist的各种方法,最后用Collections.sort实现排序
package Java基础50题;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
/*
* Lawliet.2018.3.24
*/
/*
* 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
*/
public class example_30 {
public static void main(String[] args){
int[] martx ={1,2,5,8,10};
ArrayList list = new ArrayList();
for(int i = 0; i < martx.length; i++){
list.add(martx[i]);
}
System.out.print("当前数组为:");
for(int i = 0; i < list.size(); i++){
System.out.print(list.get(i) + " ");
}
System.out.println();
System.out.print("请输入添加的数:");
Scanner in = new Scanner(System.in);
int element = in.nextInt();
list.add(element);
Collections.sort(list);
System.out.print("排序之后数组为:");
for(int i = 0; i < list.size(); i++){
System.out.print(list.get(i) + " ");
}
}
}