30/09/2018, 18:10

Xin hỏi về cách xử lí số nguyên lớn (có trăm ngàn chữ số)

Chào anh chị. Anh chị có thể chỉ em cách xử lí một số nguyên lớn (có hàng trăm chữ số). Thầy em chỉ nói là xử lí bằng kiểu string, nhưng em không biết làm sao hết anh chị. Em phải xử lí 2 số đó rồi cộng trừ với nhau. Cám ơn anh chị trước ạ

*grab popcorn* viết 20:13 ngày 30/09/2018

Cộng theo cột như hồi tiểu học cộng ấy.

Nguyễn Cát Long Huy viết 20:21 ngày 30/09/2018

Cái này kiểu xâu mà bạn? Làm sao nó biết số cuối hay sao đó để cộng?

Chế Tiệp Chân Khoa viết 20:14 ngày 30/09/2018

lấy kí tự cuối bạn ạ, cứ lần lượt, để 1 biến lưu có nhớ ko

Nguyễn Cát Long Huy viết 20:27 ngày 30/09/2018

kiểu xâu mà chia được hả bạn? Số này có hàng trăm ngàn chữ số lận, nên long long cũng không thể dùng được

Chế Tiệp Chân Khoa viết 20:20 ngày 30/09/2018

à ghi nhầm, mình sửa rùi đó, lấy kí tự cuối ra biến thành số rùi cộng

*grab popcorn* viết 20:14 ngày 30/09/2018

‘1’ - ‘0’ = 1
Hehehehe, vậy ta nhập vào chuỗi, sau đó biến nó thành mảng byte chứa cả trăm chữ số, với mỗi chữ số nằm 1 ô trong mảng.
Và rồi ta cộng thôi!

Nguyễn Cát Long Huy viết 20:27 ngày 30/09/2018

mình chưa hiểu ý bạn nữa. Vd số đó là 1234567890 và 9876543210 đi thì làm sao bạn?

Chế Tiệp Chân Khoa viết 20:23 ngày 30/09/2018

như rày, code python nhá

from itertools import zip_longest
c = []
remain = 0
for (i,j) in zip_longest(reversed(a), reversed(b), fillvalue=0):
    i = int(i)
    j = int(j)
    remain = 1 if i+j+remain >=10 else 0
    c.append((i+j)%10+remain)
for char in c: print(char, end='')
Nguyễn Cát Long Huy viết 20:14 ngày 30/09/2018

python mình không biết bạn. Chỉ biết C++. Sr bạn

*grab popcorn* viết 20:21 ngày 30/09/2018

Nè nha
số nhỏ thôi, số to viết nhiều mình lười viết
a = 123
b = 31

Thì a và b đang ở dạng chuỗi.
Ta biến nó thành mảng a_ bằng cách 1 vòng for

for(int i=0;i<a.length();i++) {
 a_[i] = a[i] - '0';
}

Tương tự với b.
Vậy là ta đc 2 mảng số, bh thì làm cộng như lớp 1 thôi

 123
+031
-------
=154

Nhưng nếu bạn ko thích đổi từ chuỗi sang 1 mảng riêng, thì lúc tính toán bạn đổi trực tiếp cũng đc. Nhưng lại mất công đổi 2 lần (kí tự -> số, rồi số -> kí tự)

Bạn cứ từ từ suy ngẫm là ra thôi.

Nguyễn Cát Long Huy viết 20:11 ngày 30/09/2018

Mình mới học C++ nên hỏi ngu một xí nhe bạn. a.length() là gì và a_[i] = a[i] - '0'; có nghĩa gì bạn?

Chế Tiệp Chân Khoa viết 20:23 ngày 30/09/2018

bạn phải chú ý, trong hai số có 1 số dài hơn, như vậy bạn có thể chèn thêm một dãy 0 vào đầu số ngắn hơn cho dài = số kia, sau đó đặt 1 biến con nhớ (4+8=2 nhớ 1 đó), loop:

(a[i]+b[i]+nhớ)%10

, nếu lớn hơn 10 thì nhớ = 1

a.length()

là độ dài mảng, chuỗi,
PS: hỗ trợ tận tình mà nãy giờ ko thấy like j hết dạ

*grab popcorn* viết 20:16 ngày 30/09/2018

a.length() = lấy chiều dài của chuỗi a
a_[i] = a[i] - ‘0’ = đổi kí tự a[i] thành số.
Như ‘1’ - ‘0’ = 1

Nguyễn Cát Long Huy viết 20:18 ngày 30/09/2018
  • ‘0’ là trừ cho số 0 á hả bạn?
Nguyễn Cát Long Huy viết 20:17 ngày 30/09/2018

hehe quên mất. Sr bạn nhe

Gió viết 20:16 ngày 30/09/2018

Cộng trừ thì làm bt. Nhân thì FFT mới chạy nổi 10^5 chữ số. Chia thì dùng newton hoặc naive

Nguyễn Cát Long Huy viết 20:13 ngày 30/09/2018

có phải kí tự thứ nhất từ phải sang trái vd là 1 thì a[1] sẽ là 1 đúng ko bạn, cứ chạy cho đến khi nó hết?

*grab popcorn* viết 20:16 ngày 30/09/2018

như ví dụ trên thì đúng là v
Chạy đến khi đạt đến chiều dài của chuỗi thì thôi.
Mà lưu ý với 2 số chênh lệch chữ số với nhau nhé.
frostphantom có nói rồi đó

Nguyễn Cát Long Huy viết 20:20 ngày 30/09/2018

khi cộng 2 số đó với nhau thì dùng vòng for đúng không bạn? Vậy điều kiện là gì bạn?

Nguyễn Cát Long Huy viết 20:24 ngày 30/09/2018

thêm 1 dàn số 0 trước 1 số sao cho chiều dài của nó bằng chiều dài số kia làm sao bạn?

Bài liên quan
0