Bài 2: Bài tập Java Toán, Số học - Tổng hợp Bài tập Java có lời giải

Đăng bởi: Admin | Lượt xem: 6597 | Chuyên mục: Java


Trong bài này mình sẽ tổng hợp một số bài tập Java liên quan đến các bài toán số học, tìm UCLN, BCNN, số nguyên tố, giai thừa, luỹ thừa, giải phương trìnhTrong bài này mình sẽ tổng hợp một số bài tập Java liên quan đến các bài toán số học, tìm UCLN, BCNN, số nguyên tố, giai thừa, luỹ thừa, giải phương trình
Bài 1. Tính giai thừa 
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.
Hướng dẫn:
Bài này chúng ta có thể sử dụng vòng lặp hoặc đệ quy để giải 
Code mẫu:
package vn.vncoder;

import java.util.Scanner;

 
public class Main {
    
    public static void main(String[] args) {
        System.out.print("Nhập số nguyên dương n = ");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int gt = 1;
        for (int i = 1; i <= n; i++){
            gt = gt * i;
        }
        System.out.println("Giai thừa của " + n + " là: " + gt);
    }
  
   
}
Code mẫu đệ quy:
package vn.vncoder;

import java.util.Scanner;

 
public class Main {
    
    public static void main(String[] args) {
        System.out.print("Nhập số nguyên dương n = ");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println("Giai thừa của " + n + " là: " + tinhGiaithua(n));
    }
  
    /**
     * tinh giai thua
     */
    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 = 5
Giai thừa của 5 là: 120
Bài 2. Kiểm tra số nguyên tố
Nhập vào một số nguyên dương n, kiểm tra xem n có phải là số nguyên tố hay không?
Hướng dẫn:
Nếu n < 2 thì n không phải là số nguyên tố
Nếu n >= 2 thì n là số nguyên tố nếu n chỉ chia hết cho một và chính nó. 
Ta dùng phòng for cho biến i chạy từ 2 tới căn bậc 2 của n, nếu n chia hết cho i thì n không phải là số nguyên tố
Code mẫu:
package vn.vncoder;

import java.util.Scanner;

 
public class Main {
    
    public static void main(String[] args) {
        System.out.print("Nhập số nguyên dương n = ");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        
        if (n < 2) {
            System.out.println("n không phải là số nguyên tố");
        }
        
        boolean isSoNguyenTo = true;
        
        for (int i = 2; i < Math.sqrt(n); i++){
            if(n%i == 0){
                isSoNguyenTo = false;
                break;
            }
        }
        
        if (isSoNguyenTo) {
            System.out.println("n là số nguyên tố");
        } else {
            System.out.println("n không phải là số nguyên tố");
        }
          
    }
  
   
}
Kết quả:
Nhập số nguyên dương n = 8
n không phải là số nguyên tố

Nhập số nguyên dương n = 13
n là số nguyên tố
Bài 3. Liệt kê số nguyên tố
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
Hướng dẫn:
Bài này tương tự bài trên, tuy nhiên chúng ta sẽ dùng vòng for duyệt các số nguyên dượng từ 2 tới n, và kiểm tra từng số này bằng một hàm check số nguyên tố
Code mẫu:
package vn.vncoder;

import java.util.Scanner;

public class Main {
  
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        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 VNCoder
     * @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 = 30
Tất cả các số nguyên tố nhỏ hơn 30 là: 
2 3 5 7 11 13 17 19 23 29
Bài 4. Tìm Ước chung lớn nhất (UCLN) và Bội chung nhỏ nhất (BCNN) của 2 số nguyên dương a và b nhập từ bàn phím
Hướng dẫn:
Sử dụng Giải thuật Euclid, hay Thuật toán Euclid, là một giải thuật giúp tính ước số chung lớn nhất (ƯSCLN) của hai số một cách hiệu quả. Giải thuật này đã được biết đến từ khoảng năm 300 trước Công Nguyên. Nhà toán học Hy Lạp cổ Euclid đã viết giải thuật này trong cuốn sách toán nổi tiếng Elements.
Ở dạng đơn giản nhất, thuật toán Euclid bắt đầu với cặp số nguyên dương, và tạo ra một cặp số nguyên dương mới bao gồm số nhỏ hơn và phần dư của phép chia hai số ban đầu. Quá trình được tiếp tục cho đến khi hai số trong cặp bằng nhau, giá trị lúc đó sẽ trở thành ước số chung lớn nhất của cặp số ban đầu.
Code mẫu:
package vn.vncoder;

import java.util.Scanner;

 
public class Main {
   
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        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 = 8
Nhập số nguyên dương b = 20
USCLN của 8 và 20 là: 4
BSCNN của 8 và 20 là: 40
Bài 5. Viết chương trình giải phương trình bậc 2: ax2 + bx + c = 0. 
Giải phương trình bậc hai thì chúng ta dùng công thức Delta đã học ở phổ thông
Code mẫu:
package vn.vncoder;

import java.util.Scanner;
 
public class Main {
   
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        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();
        
         // 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 = 3
Nhập hằng số tự do, c = -9
Phương trình có 2 nghiệm là: x1 = 1.5 và x2 = -3.0
Bài 6. Dãy số Fibonacci
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.vncoder;

import java.util.Scanner;
 
public class Main {
   
    public static void main(String[] args) {
       Scanner scanner = new Scanner(System.in);
       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 = 9
9 số đầu tiên của dãy số fibonacci: 
0 1 1 2 3 5 8 13 21
Bài 7. Chuyển đổi hệ cơ số
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.
Bài này áp dụng cho các bài toán chuyển sang hệ nhị phân cơ số 2, hệ thập phân cơ số 10 và hệ thập lục phân (hexa) cơ số 16
Hướng dẫn:
  • 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.vncoder;

import java.util.Scanner;
 
public class Main {
   
    public static final char CHAR_55 = 55;
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        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(n, 2));
        System.out.println("So " + n + " trong he co so 16 = "
                + convertNumber(n, 16));
    }
      
    /**
     * chuyen doi so nguyen n sang he co so b
     * 
     * @author vncoder.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 = 235
So 235 trong he co so 2 = 11101011
So 235 trong he co so 16 = EB
Bài 8. Viết chương trình phân tích số nguyên n thành các thừa số nguyên tố trong java. Ví dụ: 100 = 2x2x5x5
Code mẫu:
package vn.vncoder;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
public class Main {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
         System.out.print("Nhập số nguyên dương n = ");
        int n = scanner.nextInt();
        // phân tích số nguyên dương n
        List<Integer> listNumbers = phanTichSoNguyen(n);
        // in kết quả ra màn hình
        System.out.printf("Kết quả: %d = ", n);
        int size = listNumbers.size();
        for (int i = 0; i < size - 1; i++) {
            System.out.print(listNumbers.get(i) + " x ");
        }
        System.out.print(listNumbers.get(size - 1));
    }
      
    /**
     * Phân tích số nguyên thành tích các thừa số nguyên tố 
     * 
     * @param positiveInt
     * @return
     */
    public static List<Integer> phanTichSoNguyen(int n) {
        int i = 2;
        List<Integer> listNumbers = new ArrayList<Integer>();
        // phân tích
        while (n > 1) {
            if (n % i == 0) {
                n = n / i;
                listNumbers.add(i);
            } else {
                i++;
            }
        }
        // nếu listNumbers trống thì add n vào listNumbers
        if (listNumbers.isEmpty()) {
            listNumbers.add(n);
        }
        return listNumbers;
    }
}
Kết quả:
Nhập số nguyên dương n = 75
Kết quả: 75 = 3 x 5 x 5
Bài 9. Viết chương trình tính tổng của các chữ số của môt số nguyên n trong java. Số nguyên dương n được nhập từ bàn phím. Với n = 1234, tổng các chữ số: 1 + 2 + 3 + 4 = 10
Code mẫu:
package vn.vncoder;

import java.util.Scanner;
 
public class Main {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Nhập số nguyên dương n = ");
        int n = scanner.nextInt();
        System.out.printf("Tổng của các chữ số "
                + "của %d là: %d", n, totalDigitsOfNumber(n));
    }
      
    /**
     * Tính tổng của các chữ số của một số nguyên dương
     * 
     * @param n: số nguyên dương
     * @return
     */
    public static int totalDigitsOfNumber(int n) {
        int total = 0;
        do {
            total = total + n % 10;
            n = n / 10;
        } while (n > 0);
        return total;
    }
}
Kết quả:
Nhập số nguyên dương n = 123
Tổng của các chữ số của 123 là: 6
Bài 10. Viết chương trình kiểm tra một số n là số thuận nghịch trong java. Số nguyên dương n được nhập từ bàn phím.
Hướng dẫn:
Một số được gọi là số thuận nghịch nếu ta đọc từ trái sang phải hay từ phải sang trái số đó ta vẫn nhận được một số giống nhau. Ví dụ 123321 là một số thuận nghịch. Hãy liệt kê tất cả các số thuận nghịch có 6 chữa số
Code mẫu:
package vn.vncoder;

import java.util.Scanner;
 
public class Main {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Nhập số nguyên dương n = ");
        int n = scanner.nextInt();
        System.out.println(n + " là số thuận nghịch: " + isThuanNghich(n));
        System.out.print("Nhập số nguyên dương m = ");
        int m = scanner.nextInt();
        System.out.println(n + " là số thuận nghịch: " + isThuanNghich(m));
    }
      
    /**
     * Kiểm tra số thuận nghịch
     * 
     * @param n: số nguyên dương
     * @return true là số thuận nghịch
     *         false không là số thuận nghịch
     */
    public static boolean isThuanNghich(int n) {
        // chuyển đổi số n thành một chuỗi String
        String numberStr = String.valueOf(n);
        // kiểm tra tính thuận nghịch
        int size = numberStr.length();
        for (int i = 0; i < (size/2); i++) {
            if (numberStr.charAt(i) != numberStr.charAt(size - i - 1)) {
                return false;
            }
        }
        return true;
    }
}
Kết quả:
Nhập số nguyên dương n = 1234321
1234321 là số thuận nghịch: true
Nhập số nguyên dương m = 123456
1234321 là số thuận nghịch: false
Bài 11Hãy viết chương trình nhập vào số nguyên dương n. Kiểm tra xem n có phải là số chính phương hay không?
Hướng dẫn:
Số chính phương là số khi lấy căn bặc 2 có kết quả là nguyên:
Dùng phương thức sqrt() để tính căn bậc 2 và kiểm tra n là số chính phương hay không?
Code mẫu:
package vn.vncoder;

import java.util.Scanner;
 
public class Main {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Nhập số nguyên dương n = ");
        int n = scanner.nextInt();
        boolean res = checkSquareNum(n);
        if(res) {
            System.out.println(n + " là số chính phương");
        }
        else {
            System.out.println(n + " không phải là số chính phương");
        }
         
       
    }
     
    public static boolean checkSquareNum(int n) {
         
        int temp = (int)Math.sqrt(n);
        if(temp*temp == n) {
            return true;
        }
        else {
            return false;
        }
    }
}
Kết quả:
Nhập số nguyên dương n = 7
7 không phải là số chính phương

Nhập số nguyên dương n = 9
9 là số chính phương
Như vậy mình đã giới thiệu với các bạn một số bài toán Java liên quan đến số học, các bạn có thể tìm các cách giải khác hoặc vận dung để giải các bài tương tự, Chúc các bạn học tốt.
Bài tiếp theo: Bài tập Java về mảng, dãy số >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!