PDA

View Full Version : dễ mà khó



bao_luu
29-04-2005, 16:23
Làm sao chia hai số rất lớn ..trong khi bộ nhớ của kểu dữ liệu trong C++
ví dụ:300000000000003333333333322222222200000/222222222030303030303
làm sao chia..mong thỉnh giáo.

mtnhan
29-04-2005, 16:34
để chia hoặc thao tác trên số lớn, bạn không thể khai báo kiểu dữ liệu trong C++ được. Bạn phải dùng cách xử lý chuổi thôi.
khai báo 2 số đó dưới dạng string.
sau đó bạn phải viết lại các phép toán cho 2 số đó (overload operator).
have fun

bao_luu
29-04-2005, 17:12
Tui đã khai báo theo kểu string rồi...nhưng quan trọng là thuật toán khi xử lý đối với phép chia hai ssố lớn như thế nào

ndmanh
29-04-2005, 17:14
search on google.com

bao_luu
03-05-2005, 14:40
nói như vậy thì ai mà không biết nói

bete
04-05-2005, 05:32
http://ddth.com/showthread.htm?t=64285

-thân

danh_quyen
26-05-2005, 09:39
bạn phải viết 2 hàm cộng và trừ 2 số lớn bằng chuổi nè. sau đó bạn xử lý phép chia 2 số lớn giống như chia bằng tay. Dựa vào thuật phép toán phép tính tay để tính. Lúc còn đi học tui đã từng làm trên C++ rùi. cũng đơn giản lắm đó. Chúc bạn thành công.
;-).

Hermex
26-05-2005, 16:14
Co rat nhieu ung dung , tinh toan cac so lon duoc ap dung nhat nhieu trong ma hoa .Vi du de phan tich mot so rat lon thanh tich hai so trong mot khoang thoi gian bi gioi han , hien nay van chua co thuat toan huu hieu nao giai quyet duoc van de do . Hay phuong trinh x^e = b ( mod n ) du biet e,b , n nhung viec tim nguoc lai x la rat kho ( khi n cuc lon vd n = 256,512, 1024 .. ) , cac may tinh hien gio cung khong the tinh duoc .

thailehuy
26-05-2005, 16:32
Nếu mà cái việc Hermex nói làm được trong khoảng thời gian giới hạn thì hệ bảo mật RSA đã tiêu tùng rồi, vì cách tìm key mã hoá của nó là dựa trên cái thuật toán nhân chia 2 số nguyên tố cực lớn :)

Cu Tài tìm sách trên thư viện mà đọc sẽ thấy đó :)

thailehuy
26-05-2005, 16:39
Computing Theory, có 1 chapter nói về Data Encoding and Decoding :)

thailehuy
26-05-2005, 16:43
Bổ sung chút xíu: Dù chưa có thuật toán nào hoàn hảo nhưng người ta thường giải bằng phương pháp tìm nghiệm ước lượng (tức là không chính xác) --> dù sao có còn hơn không :D

Hermex
27-05-2005, 03:04
Nếu mà cái việc Hermex nói làm được trong khoảng thời gian giới hạn thì hệ bảo mật RSA đã tiêu tùng rồi, vì cách tìm key mã hoá của nó là dựa trên cái thuật toán nhân chia 2 số nguyên tố cực lớn :)

Thuc ra hien nay dang co mot huong nghien cuu moi la tinh toan luong tu , de tao ra cac may tinh luong tu , toc do tinh toan luc do se rat nhanh va theo ly thuyet se be duoc cac thuat toan nhu RSA , IDEA , AES .. , nhung tat ca moi dang o tren ly thuyet . Rieng ve RSA thi hien nay nguoi ta cung da gioi han duoc mot so truong hop neu ma khoa cong khai roi vao mot trong cac truong hop do thi cung co kha nang be duoc . RSA da ton tai duoc khoang 30 nam , va bay gio van chay tot :yes:
Neu ai quan tam den cac thuat toan ma hoa tren co the doc bat cu sach nao viet ve cryptography

hitech
07-06-2005, 07:42
Làm sao chia hai số rất lớn ..trong khi bộ nhớ của kểu dữ liệu trong C++
ví dụ:300000000000003333333333322222222200000/222222222030303030303
làm sao chia..mong thỉnh giáo.
Nếu số lớn thì xử lý bằng chuỗi (String), cài đặt thuật toán giống như bạn thực hiện phép chia bằng tay. lol

mtt333
07-06-2005, 07:53
Làm sao chia hai số rất lớn ..trong khi bộ nhớ của kểu dữ liệu trong C++
ví dụ:300000000000003333333333322222222200000/222222222030303030303
làm sao chia..mong thỉnh giáo.

Không hiểu mục đích của bạn khi làm bài này

Bạn nào có thể nêu được các ví dụ thực tế trong khoa học, kỹ thuật, sản xuất cần thiết phải sử dụng phép chia hai số rất lớn với độ chính xác cao như vậy không???

Phần lớn các ứng dụng thực tế trong khoa học, kỹ thuật, sản xuất không tính toán chính xác đến như vậy, mà chỉ lấy gần đúng:

Ví dụ của bạn trong thực tế được chuyển thành 3.000 *10^38/ 2.222 * 10^20 là đạt độ chính xác phần nghìn rùi.

hitech
10-06-2005, 09:34
Không hiểu mục đích của bạn khi làm bài này

Bạn nào có thể nêu được các ví dụ thực tế trong khoa học, kỹ thuật, sản xuất cần thiết phải sử dụng phép chia hai số rất lớn với độ chính xác cao như vậy không???

Phần lớn các ứng dụng thực tế trong khoa học, kỹ thuật, sản xuất không tính toán chính xác đến như vậy, mà chỉ lấy gần đúng:

Ví dụ của bạn trong thực tế được chuyển thành 3.000 *10^38/ 2.222 * 10^20 là đạt độ chính xác phần nghìn rùi.

Trong kỹ thuật hàng không vũ trụ thì sao? :D Sai 1 ly đi vạn dặm.

mtt333
10-06-2005, 11:12
Trong kỹ thuật hàng không vũ trụ thì sao? :D Sai 1 ly đi vạn dặm.

Bạn ơi, ngành nào cũng vậy thôi, luôn luôn tồn tại sai số và phải biết chấp nhận và biết đánh giá sai số.

Nếu đòi hỏi độ chính xác cao (cao chứ không phải tuyệt đối) người ta sử dụng các loại dấu phẩu động có độ chính xác rất lớn. Nếu sai một ly đi vạn dặm thì hãy làm cho nó sai không quá 1 phần nghìn vạn ly bạn sẽ đi không quá 1 phần nghìn dặm.

Hơn nữa việc tính toán trên dấu phảy động thì nhanh hơn rất nhiều so với dùng mảng số để mô tả số rất lớn. Để có được độ chính xác tuyệt đối đó mà phải chờ hàng giờ đồng hồ thì có lẽ cũng đi quá một vạn dặm mất rồi.

mtt333
10-06-2005, 21:14
Kỹ thuật tính toán trên 2 số rất lớn là một phần của Symmetric encryption, được phát minh năm 1977 và hiện giờ vẫn còn được ứng dụng rất nhiều trong việc bảo mật cho các thông tin không quá quan trọng.

Cái này thì mình không biết,
Cám ơn bạn đã chỉ cho mình thấy một ứng dụng của việc tính toán với số rất lớn.
Bạn có thể nêu chi tiết hơn được không???

Zero
02-07-2005, 08:03
Tính toán với số lớn thường được dùng trong các bài toán khoa học or trong ngân hàng (kô quá lớn ^_^), một soft tính toán khá phổ biến là Mapple (nhớ đùng kô nhỉ).

Đấy là trong thực tế còn trong trường hợp này nó (có lẽ) chỉ là để luyện kỹ năng lập trình.

nguoikicuc
04-07-2005, 10:22
Thật ra đây là 1 trong những project tôi có làm trong lúc còn học ĐH, gọi là "BigNum". Chẳng có gì gọi là bí mật hay khó hiểu cả, bạn define class để chứa 1 number, stored bằng string, string thì có thể chứa 1 number hàng trăm digits. Sau đó, defined những class methods để cộng, trừ, nhân, chia, vân vân. Vậy thôi.

thanh_mai
07-07-2005, 11:43
Hi tớ nghĩ nếu đi sâu vào thì kô chỉ "vậy thôi" đâu.

Một số phép đơn giản vd như hàm mũ (dùng rất nhiều) lại kô dễ cài chút nào

Tớ nhớ lại 1 chuyện cũ

1234567^1234567 Mapple tính mất 12s (kô rõ nhớ có đúng kô có thể chỉ là 123456^123456 cũng có thể là 12345678^12345678)

Bạn của tớ sau 1 hồi hì hục (mày nhỉ :) ) search được :D 1 thuật toán mới- sau đó cài mất 2 ngày chỉ để được tốc độ kc 8s

Xử lý số lớn rất thú vị nhưng không thực tế giải trí là chính thôi : )

bao_luu
08-07-2005, 16:57
Mình thấy các bạn bàn vấn đề này nhiều nhỉ,Mình muốn nghiên cứu coi thử xem việc thực hiện nó như thế nào là tối ưu thôi.CHứ nếu nhân chia hai số lớn theo cách bình thườngthì không có vấn đề gì đâu,chủ yếu là làm sao tiết kiệm thời gian và bộ nhớ.
Không Cần biết bạn viết bằng ngôn ngữ gì,chỉ cần thuật toán chính xác và hay là có thể cài đặt bằng bất kỳ ngôn ngữ lập trình nào.
Chúc các bạn vui vẻ!!!!!!!