Trong bài viết này mình sẽ chia sẻ cho các bạn cách tính cộng hai số cực lớn code bằng ngôn ngữ java để cho các bạn tham khảo nhé!
Về vấn đề cộng hai số cực lớn thì bạn phải nghĩ cách lưu được số lớn đó vào trong bộ nhớ. Vê lưu số lớn thì có 2 cách: bạn có thể dùng một mảng số nguyên hoặc dùng một chuỗi kí tự để lưu nó lại. Ở đây mình sẽ dùng phương pháp thứ 2 là cho nó vào một chuỗi String để thực hiện phép tính.
Mỗi thằng có một lợi điểm riêng, như dùng mảng số nguyên thì không phải mất công chuyển đổi từ kiểu string sang int để tính toán, ..
Đó là việc lưu trữ. Còn về việc tính toán thì lúc này bạn có thể sử dụng cách tính cộng thủ công theo phương pháp cấp 1: tức là cộng lần lượt từ phải sang trái, và có nhớ khi cộng.
Luyên thuyên đủ rồi, giờ mình sẽ giải thích phương pháp của mình nhé!
Cách 1: Dùng Thuật toán Cộng Hai Số Cực Lớn JAVA
Bước 1: Nhập 2 số nguyên lớn bằng phương pháp nhập theo kiểu chuỗi String.
//tạo mot ham nhap static void nhap() { String s1, s2; Scanner s = new Scanner(System.in); System.out.println("Nhap 2 so nguyen lon. "); System.out.print("Nhap so nguyen thu nhat: "); s1 = s.next(); System.out.print("Nhap so nguyen thu hai: "); s2 = s.next(); }
Bước 2: Tạo một hàm đảo ngược chuỗi. (Mình muốn chuyển ngược chuỗi, ví dụ có chuỗi “1234” thì sẽ được đảo thành “4321“. Mục đích của mình là thực hiện phép cộng lần lượt từ trái qua phải.)
static String daoXau(String s) { String s1 = ""; for (int i = 0; i < s.length(); i++) { s1 += s.charAt(s.length() - 1 - i); } return s1; //xuat chuoi sau khi dao }
Bước 3: Tạo Hàm tính tổng.
//tạo mot ham tinh tong static String add(String s1, String s2) { String s = ""; int len1 = s1.length(); int len2 = s2.length(); int max = max(len1, len2); //ham max length xuat ra gia tri chieu dai lon nhat trong 2 chuoi s1 = daoXau(s1); s2 = daoXau(s2); //thuc hien noi them so 0 vao chuoi voi muc dich lam cho 2 chuoi so bang nhau if (max > len1) { for (int i = max; i >= len1; i--) { s1 += "0"; } } if (max > len2) { for (int i = max; i >= len2; i--) { s2 += "0"; } } //thuc hien phep cong int soGhiNho = 0; for (int i = 0; i < max; i++) { int tong = 0; //charAt ky tu tai vi tri thu i trong xau tong = s1.charAt(i) - '0' + s2.charAt(i) - '0' + soGhiNho; s += tong % 10; soGhiNho = tong / 10; } if (soGhiNho == 1) { s += 1; } //thuc hien dao xau truoc khi xuat s = daoXau(s); return s; }
Vì mình thực hiện phép cộng từ trái sang phải nên kết quả sau khi tính ra sẽ bị ngược. Vì thế ở cuối hàm cộng trêm, mình phải thực hiện đảo chuỗi một lần nữa rồi mới cho return ra.
Như vậy ta sẽ có được Code Hoàn chỉnh như sau:
public class CongSoNguyenLon { public static void main(String[] args) { nhap(); } static String daoXau(String s) { String s1 = ""; for (int i = 0; i < s.length(); i++) { s1 += s.charAt(s.length() - 1 - i); } return s1; //chuoi sau khi dao } static String add(String s1, String s2) { String s = ""; int len1 = s1.length(); int len2 = s2.length(); int max = max(len1, len2); //ham max length xuat ra gia tri chieu dai lon nhat trong 2 chuoi s1 = daoXau(s1); s2 = daoXau(s2); //thuc hien noi them so 0 vao chuoi voi muc dich lam cho 2 chuoi so bang nhau if (max > len1) { for (int i = max; i >= len1; i--) { s1 += "0"; } } if (max > len2) { for (int i = max; i >= len2; i--) { s2 += "0"; } } //thuc hien phep cong int soGhiNho = 0; for (int i = 0; i < max; i++) { int tong = 0; //charAt ky tu tai vi tri thu i trong xau tong = s1.charAt(i) - '0' + s2.charAt(i) - '0' + soGhiNho; s += tong % 10; soGhiNho = tong / 10; } if (soGhiNho == 1) { s += 1; } //thuc hien dao xau truoc khi xuat s = daoXau(s); return s; } static void nhap() { String s1, s2; Scanner s = new Scanner(System.in); System.out.println("Nhap 2 so nguyen lon. "); System.out.print("Nhap so nguyen thu nhat: "); s1 = s.next(); System.out.print("Nhap so nguyen thu hai: "); s2 = s.next(); //xuat tong System.out.println(); String ss = add(s1, s2); System.out.println("Tong 2 so nguyen lon: " + ss); } }
Đây là kết quả:
Đó là thuật toán hàn chỉnh để tính cộng hai số cực lớn, nếu code mình có sai sót ở đâu mong được sự chỉ giáo của các bạn.
Ngoài thuật toán mình build ở trên ra. Java thực chất đã có bộ thư viện khổng lồ nhằm phục vụ cho các bạn rồi nên các bạn cũng có thể sử dụng BigDecimal hoặc BigInteger để thực hiện phép cộng này nhé!
Cách 2: Sử dụng BigInteger để cộng hai số cực lớn.
public static void main(String[] args) { BigInteger num1,num2; num1 = new BigInteger("655555555555555555554365435555555555555544745765476547654765476476"); num2 = new BigInteger("65555555465547654755543654365465555555555547654755554765755555555544745765476547654765476476"); System.out.println("Tong: " + num1.add(num2)); System.out.println("Hieu: " + num1.subtract(num2)); System.out.println("Tich: " + num1.multiply(num2)); System.out.println("Thuong: " + num1.divide(num2)); }
Cách 3: Sử dụng BigDecimal để cộng hai số cực lớn.
public static void main(String[] args) { Scanner input = new Scanner(System.in); BigDecimal a,b,c; System.out.print("Nhap a: "); a = new BigDecimal(input.next()); System.out.print("Nhap b: "); b = new BigDecimal(input.next()); c = a.add(b); System.out.println("c = a + b = " + c); }
Và Cách 4: Bạn cũng có thể sử dụng LinkedList để cộng hai số lớn.
public static void main(String[] args) { Scanner scan = new Scanner(System.in); /* Create Linked Lists */ LinkedList<Integer> num1 = new LinkedList<Integer>(); LinkedList<Integer> num2 = new LinkedList<Integer>(); LinkedList<Integer> ans = new LinkedList<Integer>(); /* Accept numbers */ System.out.println("Adding Large Numbers Using Linked Lists Test\n"); System.out.println("Enter number 1"); String s1 = scan.next(); System.out.println("Enter number 2"); String s2 = scan.next(); /* Store digits in lists */ int l1 = s1.length(), l2 = s2.length(); for (int i = l1 - 1; i >= 0; i--) num1.add(s1.charAt(i) - '0'); for (int i = l2 - 1; i >= 0; i--) num2.add(s2.charAt(i) - '0'); /* Adding digits and storing in ans list */ int len = l1 > l2 ? l1 : l2; int carry = 0; for (int i = 0; i < len; i++) { int d1 = 0, d2 = 0; try { d1 = num1.get(i); } catch(Exception e){} try { d2 = num2.get(i); } catch(Exception e){} int x = d1 + d2 + carry; ans.add(x % 10); carry = x / 10; } /* Adding carry */ while (carry != 0) { ans.add(carry % 10); carry /= 10; } /* Printing ans list */ System.out.print("\nSum = "); for (int i = ans.size() - 1; i >= 0; i--) System.out.print(ans.get(i)); System.out.println(); }
Nếu có vấn đề hay thắc mắc gì hoặc bạn không biết cách chỉnh sửa thì hãy bình luận bên dưới để cùng trao đổi và giúp đỡ các bạn nhé!
Xem thêm:
- Share code game MegamanX3 viết bằng C++
- Chia sẻ 6 mẫu Code Form Login giao diện cực đẹp và dễ thương cho Website
- Share Source Code Chào Mừng Năm Mới Với Hiệu Ứng Tuyệt Đẹp
- Share Source Code Count-Down Đếm ngược thời gian phong cách J2team
CHÚC CÁC BẠN THÀNH CÔNG VÀ VUI VẺ
Leave a Reply