Tìm bcnn của số nguyên lớn

Mọi người cho e hỏi bài này với ạ?

bcnn(a, b) = a*b/ucln(a,b)

đặt x = bcnn(a, b)
bcnn(a, b, c) = x*c/ucln(x, c)

1 Like

Phép chia phải thực hiện trước vì phép nhân sẽ ra số lớn, dù kết quả không lớn.

3 Likes

rồi phép chia nó không chẵn thì sao?
nếu đã nói tới trường hợp đó thì sẽ phải tính đến chuyện kết quá lên tới ~10^180, phải xử lý số nguyên lớn bằng array hoặc (cấu trúc dữ liệu nào đó có thể đáp ứng được)

Chia cho ước chung lớn nhất thì sao lại không chẵn chứ :smiley:

2 Likes

ok, cả x và c đều chia hết cho số ước chung của nó
tính x/ucln(x, c) trước để để kết quả nó nhỏ một chút
sau đó nhân lại với c, thì có chắc là kết quả nó vẫn chứa được trong 1 biến không?

2 Likes

Vậy là phải nhắc lại :smiley:

2 Likes

Một dãy các số nguyên dương thì TH BCNN của chúng lớn nhất là khi dãy toàn là các số nguyên tố cùng nhau (tức là chúng có UCLN = 1). Khi đó, BCNN(t1, t2, …, tn) = t1 * t2 * … tn.

Đề bài cho n <= 30 và t <= 10^6. Suy ra được BCNN < (10^6)^30, tức < 10^180 < Double max value (≈10^308). Vậy thay vì truyền vào số nguyên, bạn nên truyền double vào.

Kiểu double thì C++ không có định nghĩa toán tử % (khi tính UCLN thì dùng cần nó), bạn có thể thay thế bằng:

double tmp = a/b; //Tạo biến tạm để tránh sai số
double _trunc = trunc(tmp); //Tạo biến tạm để tránh sai số
a = a - _trunc;

Để cho an toàn, sau khi bạn tính ra được BCNN rồi, thì ép nó vào string, rồi xoá những số dư thừa ở sau dấu chấm và xoá cả dấu chấm (vì BCNN là số nguyên nên không khể có phần thập phân được).

1 Like

kiểu double đâu có chính xác tới 180 chữ số đâu em :V ví dụ viết số A vô ga drô là 6.023 x 10^23 thì tuy độ lớn nó tới 10^23 nhưng nó chỉ chính xác tới 4 chữ số 6,0,2,3 à :V Kiểu double cũng vậy, tuy độ lớn có thể tới 10^308 nhưng chính xác chỉ được 15-16 chữ số à

6 Likes

Hi hi quên mất độ chính xác, vậy phải dùng chuỗi rồi, mệt đây

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?