Bài tập tự luận java cơ bản có lời giải

Trong phần này, bạn phải nắm được các kiến thức về:

  • Các mệnh đề if-else, switch-case.
  • Các vòng lặp for, while, do-while.
  • Các từ khóa break và continue trong java.
  • Các toán tử trong java.
  • Mảng (array) trong java.
  • File I/O trong java.
  • Xử lý ngoại lệ trong java.

1. Bài 01

Viết chương trình tìm tất cả các số chia hết cho 7 nhưng không phải bội số của 5, nằm trong đoạn 10 và 200 (tính cả 10 và 200). Các số thu được sẽ được in thành chuỗi trên một dòng, cách nhau bằng dấu phẩy.

Gợi ý: Sử dụng vòng lặp for

Code mẫu:

package vn.eLib.baitap;

import java.util.ArrayList;
import java.util.List;

public class Bai01 {
  public static void main(String[] args) {
    List < Integer > list = new ArrayList < Integer > ();
    for (int i = 10; i < 201; i++) {
      if ((i % 7 == 0) && (i % 5 != 0)) {
        list.add(i);
      }
    }
    // hiển thị list ra màn hình
    showList(list);
  }

  public static void showList(List < Integer > list) {
    if (list != null && !list.isEmpty()) {
      int size = list.size();
      for (int i = 0; i < size - 1; i++) {
        System.out.print(list.get(i) + ", ");
      }
      System.out.println(list.get(size - 1));
    }
  }
}

Kết quả:

14, 21, 28, 42, 49, 56, 63, 77, 84, 91, 98, 112, 119, 126, 133, 147, 154, 161, 168, 182, 189, 196

2. Bài 02:

Viết một chương trình tính giai thừa của một số nguyên dương n. Với n được nhập từ bàn phím. Ví dụ, n = 8 thì kết quả đầu ra phải là 1*2*3*4*5*6*7*8 = 40320.

Gợi ý: Sử dụng đệ quy hoặc vòng lặp để tính giai thừa.

Code mẫu: sử dụng đệ quy

package vn.eLib.baitap;

import java.util.Scanner;

public class GiaiThuaDemo2 {
  private static Scanner scanner = new Scanner(System. in );
  /**
     * main
     *
     * @author eLib.VN
     * @param args
     */
  public static void main(String[] args) {
    System.out.print("Nhập số nguyên dương n = ");
    int n = scanner.nextInt();
    System.out.println("Giai thừa của " + n + " là: " + tinhGiaithua(n));
  }

  /**
     * tinh giai thua
     *
     * @author eLib.VN
     * @param n: so nguyen duong
     * @return giai thua cua so n
     */
  public static long tinhGiaithua(int n) {
    if (n > 0) {
      return n * tinhGiaithua(n - 1);
    } else {
      return 1;
    }
  }
}

Kết quả:

Nhập số nguyên dương n = 8
Giai thừa của 8 là: 40320

3. Bài 03:

Hãy viết chương trình để tạo ra một map chứa (i, i*i), trong đó i là số nguyên từ 1 đến n (bao gồm cả 1 và n), n được nhập từ bàn phím. Sau đó in map này ra màn hình. Ví dụ: Giả sử số n là 8 thì đầu ra sẽ là: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}.

Gợi ý: Sử dụng vòng lặp for để lặp i từ 1 đến n.

Code mẫu:

package vn.eLib.baitap;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Bai03 {
  private static Scanner scanner = new Scanner(System. in );

  public static void main(String[] args) {
    System.out.print("Nhập số nguyên dương n = ");
    int n = scanner.nextInt();

    Map < Integer,
    Integer > map = new HashMap < Integer,
    Integer > ();
    for (int i = 1; i < n + 1; i++) {
      map.put(i, i * i);
    }
    System.out.println(map);
  }
}

Kết quả:

Nhập sốnguyên dương n = 10 {
  1 = 1,
  2 = 4,
  3 = 9,
  4 = 16,
  5 = 25,
  6 = 36,
  7 = 49,
  8 = 64,
  9 = 81,
  10 = 100
}

4. Bài 04

Viết chương trình giải phương trình bậc 2: ax2 + bx + c = 0.

Code mẫu:

package vn.eLib.baitap;

import java.util.Scanner;

/**
 * Giải phương trình bậc 2
 *
 * @author viettuts.vn
 */
public class PhuongTrinhBac2 {
  private static Scanner scanner = new Scanner(System. in );
  /**
     * main
     *
     * @param args
     */
  public static void main(String[] args) {
    System.out.print("Nhập hệ số bậc 2, a = ");
    float a = scanner.nextFloat();
    System.out.print("Nhập hệ số bậc 1, b = ");
    float b = scanner.nextFloat();
    System.out.print("Nhập hằng số tự do, c = ");
    float c = scanner.nextFloat();
    giaiPTBac2(a, b, c);
  }

  /**
     * Giải phương trình bậc 2: ax2 + bx + c = 0
     *
     * @param a: hệ số bậc 2
     * @param b: hệ số bậc 1
     * @param c: số hạng tự do
     */
  public static void giaiPTBac2(float a, float b, float c) {
    // kiểm tra các hệ số
    if (a == 0) {
      if (b == 0) {
        System.out.println("Phương trình vô nghiệm!");
      } else {
        System.out.println("Phương trình có một nghiệm: " + "x = " + ( - c / b));
      }
      return;
    }
    // tính delta
    float delta = b * b - 4 * a * c;
    float x1;
    float x2;
    // tính nghiệm
    if (delta > 0) {
      x1 = (float)(( - b + Math.sqrt(delta)) / (2 * a));
      x2 = (float)(( - b - Math.sqrt(delta)) / (2 * a));
      System.out.println("Phương trình có 2 nghiệm là: " + "x1 = " + x1 + " và x2 = " + x2);
    } else if (delta == 0) {
      x1 = ( - b / (2 * a));
      System.out.println("Phương trình có nghiệm kép: " + "x1 = x2 = " + x1);
    } else {
      System.out.println("Phương trình vô nghiệm!");
    }
  }
}

Kết quả:

Nhập hệ số bậc 2, a = 2
Nhập hệ số bậc 1, b = 1
Nhập hằng số tự do, c = -1
Phương trình có 2 nghiệm là: x1 = 0.5 và x2 = -1.0

5. Bài 05

Viết chương trình chuyển đổi một số tự nhiên ở hệ số 10 thành một số ở hệ cơ số B (1 <= B <= 32) bất kỳ. Giả sử hệ cơ số cần chuyển là 2 <= B <= 16. Số đại điện cho hệ cơ số B > 10 là A = 10, B = 11, C = 12, D = 13, E = 14, F = 15.

Gợi ý:

  • Tham khảo bảng ASCII để chuyển đổi kiểu char thành String. Hàm chr(55 + m) trong ví dụ sau:
  • Nếu m = 10 trả về chuỗi “A”.
  • Nếu m = 11 trả về chuỗi “B”.
  • Nếu m = 12 trả về chuỗi “C”.
  • Nếu m = 13 trả về chuỗi “D”.
  • Nếu m = 14 trả về chuỗi “E”.
  • Nếu m = 15 trả về chuỗi “F”.

Code mẫu:

package vn.eLib.baitap;

import java.util.Scanner;

public class ConvertNumber {
  public static final char CHAR_55 = 55;
  private static Scanner scanner = new Scanner(System. in );

  /**
     * main
     *
     * @author viettuts.vn
     * @param args
     */
  public static void main(String[] args) {
    System.out.print("Nhập số nguyên dương n = ");
    int n = scanner.nextInt();
    System.out.println("So " + n + " trong he co so 2 = " + ConvertNumber.convertNumber(n, 2));
    System.out.println("So " + n + " trong he co so 16 = " + ConvertNumber.convertNumber(n, 16));
  }

  /**
     * chuyen doi so nguyen n sang he co so b
     *
     * @author eLib.vn
     * @param n: so nguyen
     * @param b: he co so
     * @return he co so b
     */
  public static String convertNumber(int n, int b) {
    if (n < 0 || b < 2 || b > 16) {
      return "";
    }

    StringBuilder sb = new StringBuilder();
    int m;
    int remainder = n;

    while (remainder > 0) {
      if (b > 10) {
        m = remainder % b;
        if (m >= 10) {
          sb.append((char)(CHAR_55 + m));
        } else {
          sb.append(m);
        }
      } else {
        sb.append(remainder % b);
      }
      remainder = remainder / b;
    }
    return sb.reverse().toString();
  }
}

Kết quả:

Nhập số nguyên dương n = 15
So 15 trong he co so 2 = 1111
So 15 trong he co so 16 = F

6. Bài 06:

Dãy số Fibonacci được định nghĩa như sau: F0 = 0, F1 = 1, F2 = 1, Fn = F(n-1) + F(n-2) với n >= 2. Ví dụ: 0, 1, 1, 2, 3, 5, 8, … Hãy viết chương trình tìm n số Fibonacci đầu tiên.

Code mẫu:

package vn.eLib.baitap;

import java.util.Scanner;

/**
* Tính dãy số Fibonacci bằng phương pháp đệ quy
* 
* @author viettuts.vn
*/
public class FibonacciExample2 {
  private static Scanner scanner = new Scanner(System. in );
  /**
    * main
    *
    * @param args
    */
  public static void main(String[] args) {
    System.out.print("Nhập số nguyên dương n = ");
    int n = scanner.nextInt();
    System.out.println(n + " số đầu tiên của dãy số fibonacci: ");
    for (int i = 0; i < n; i++) {
      System.out.print(fibonacci(i) + " ");
    }
  }

  /**
    * Tính số fibonacci thứ n
    *
    * @param n: chỉ số của số fibonacci tính từ 0
    *           vd: F0 = 0, F1 = 1, F2 = 1, F3 = 2
    * @return số fibonacci thứ n
    */
  public static int fibonacci(int n) {
    if (n < 0) {
      return - 1;
    } else if (n == 0 || n == 1) {
      return n;
    } else {
      return fibonacci(n - 1) + fibonacci(n - 2);
    }
  }
}

Kết quả: 

Nhập số nguyên dương n = 12
12 số đầu tiên của dãy số fibonacci: 
0 1 1 2 3 5 8 13 21 34 55 89 

7. Bài 07

Viết chương trình tìm ước số chung lớn nhất (USCLN) và bội số chung nhỏ nhất (BSCNN) của hai số nguyên dương a và b nhập từ bàn phím.

Gợi ý:

  • Sử dụng giải thuật Euclid.

Code mẫu:

package vn.eLib.baitap;

import java.util.Scanner;

public class USCLL_BSCNN_1 {
  private static Scanner scanner = new Scanner(System. in );
  /**
     * main
     *
     * @param args
     */
  public static void main(String[] args) {
    System.out.print("Nhập số nguyên dương a = ");
    int a = scanner.nextInt();
    System.out.print("Nhập số nguyên dương b = ");
    int b = scanner.nextInt();
    // tính USCLN của a và b
    System.out.println("USCLN của " + a + " và " + b + " là: " + USCLN(a, b));
    // tính BSCNN của a và b
    System.out.println("BSCNN của " + a + " và " + b + " là: " + BSCNN(a, b));
  }

  /**
     * Tìm ước số chung lớn nhất (USCLN)
     *
     * @param a: số nguyên dương
     * @param b: số nguyên dương
     * @return USCLN của a và b
     */
  public static int USCLN(int a, int b) {
    if (b == 0) return a;
    return USCLN(b, a % b);
  }

  /**
     * Tìm bội số chung nhỏ nhất (BSCNN)
     *
     * @param a: số nguyên dương
     * @param b: số nguyên dương
     * @return BSCNN của a và b
     */
  public static int BSCNN(int a, int b) {
    return (a * b) / USCLN(a, b);
  }
}

Kết quả:

Nhập số nguyên dương a = 10
Nhập số nguyên dương b = 24
USCLN của 10 và 24 là: 2
BSCNN của 10 và 24 là: 120

8. Bài 08

Viết chương trình liệt kê tất cả các số nguyên tố nhỏ hơn n. Số nguyên dương n được nhập từ bàn phím.

Code mẫu:

package vn.eLib.baitap;

import java.util.Scanner;

/**
 * Chương trình liệt kê tất cả các số nguyên tố nhỏ hơn n.
 *
 * @author viettuts.vn
 */
public class BaiTap08 {
  private static Scanner scanner = new Scanner(System. in );

  /**
     * main
     *
     * @param args
     */
  public static void main(String[] args) {
    System.out.print("Nhập n = ");
    int n = scanner.nextInt();
    System.out.printf("Tất cả các số nguyên tố nhỏ hơn %d là: \n", n);
    if (n >= 2) {
      System.out.print(2);
    }
    for (int i = 3; i < n; i += 2) {
      if (isPrimeNumber(i)) {
        System.out.print(" " + i);
      }
    }
  }

  /**
     * check so nguyen to
     *
     * @author viettuts.vn
     * @param n: so nguyen duong
     * @return true la so nguyen so,
     *         false khong la so nguyen to
     */
  public static boolean isPrimeNumber(int n) {
    // so nguyen n < 2 khong phai la so nguyen to
    if (n < 2) {
      return false;
    }
    // check so nguyen to khi n >= 2
    int squareRoot = (int) Math.sqrt(n);
    for (int i = 2; i <= squareRoot; i++) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }
}

Kết quả:

Nhập n = 100
Tất cả các số nguyên tố nhỏ hơn 100 là: 
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

9. Bài 09:

Viết chương trình liệt kê n số nguyên tố đầu tiên trong java. Số nguyên dương n được nhập từ bàn phím.

Code mẫu:

package vn.eLib.baitap;

import java.util.Scanner;

/**
 * Chương trình liệt kê n số nguyên tố đầu tiên.
 *
 * @author viettuts.vn
 */
public class BaiTap09 {
  private static Scanner scanner = new Scanner(System. in );

  /**
     * main
     *
     * @param args
     */
  public static void main(String[] args) {
    System.out.print("Nhập n = ");
    int n = scanner.nextInt();
    System.out.printf("%d số nguyên tố đầu tiên là: \n", n);
    int dem = 0; // đếm số số nguyên tố
    int i = 2; // tìm số nguyên tố bắt dầu từ số 2
    while (dem < n) {
      if (isPrimeNumber(i)) {
        System.out.print(i + " ");
        dem++;
      }
      i++;
    }
  }

  /**
     * check so nguyen to
     *
     * @author eLib.vn
     * @param n: so nguyen duong
     * @return true la so nguyen so,
     *         false khong la so nguyen to
     */
  public static boolean isPrimeNumber(int n) {
    // so nguyen n < 2 khong phai la so nguyen to
    if (n < 2) {
      return false;
    }
    // check so nguyen to khi n >= 2
    int squareRoot = (int) Math.sqrt(n);
    for (int i = 2; i <= squareRoot; i++) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }
}

Kết quả:

Nhập n = 10
10 số nguyên tố đầu tiên là: 
2 3 5 7 11 13 17 19 23 29 

10. Bài 10

Viết chương trình liệt kê tất cả số nguyên tố có 5 chữ số trong java.

Code mẫu:

package vn.eLib.baitap;

/**
 * Chương trình liệt kê tất cả số nguyên tố có 5 chữ số.
 *
 * @author eLib.vn
 */
public class BaiTap10 {

  /**
     * main
     *
     * @param args
     */
  public static void main(String[] args) {
    int count = 0;
    System.out.println("Liệt kê tất cả số nguyên tố có 5 chữ số:");
    for (int i = 10001; i < 99999; i += 2) {
      if (isPrimeNumber(i)) {
        System.out.println(i);
        count++;
      }
    }
    System.out.println("Tổng các số nguyên tố có 5 chữ số là: " + count);
  }

  /**
     * check so nguyen to
     *
     * @author eLib.vn
     * @param n: so nguyen duong
     * @return true la so nguyen so,
     *         false khong la so nguyen to
     */
  public static boolean isPrimeNumber(int n) {
    // so nguyen n < 2 khong phai la so nguyen to
    if (n < 2) {
      return false;
    }
    // check so nguyen to khi n >= 2
    int squareRoot = (int) Math.sqrt(n);
    for (int i = 2; i <= squareRoot; i++) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }
}

Kết quả:

Liệt kê tất cả số nguyên tố có 5 chữ số:
10007
10009
10037
...
99971
99989
99991
Tổng các số nguyên tố có 5 chữ số là: 8363

Trên đây là 10 bài tập cơ bản về Java có lời giải mà eLib đã tổng hợp được. Để hiểu rõ và vận dụng các kiến thức đã học vào quá trình lập trình, eLib khuyên bạn nên thực hành thật nhiều và thử va chạm với nhiều dạng bài tập. Chúc các bạn thành công!

Để củng cố và nắm vững các phần kiến thức đã học, các bạn có thể làm bộ câu hỏi trắc nghiệm 200 câu hỏi trắc nghiệm lập trình Java có đáp án và lời giải chi tiết 

Trắc Nghiệm