2012-03-30 34 views
5

Tôi muốn thực hiện một lớp BigInt sẽ có thể xử lý các số thực sự lớn. Tôi chỉ muốn thêm và nhân số, tuy nhiên lớp cũng nên xử lý các số âm.Tôi nên sử dụng cấu trúc dữ liệu nào cho lớp BigInt

Tôi muốn đại diện cho số dưới dạng chuỗi, nhưng có một chi phí lớn với chuỗi chuyển đổi thành int và back để thêm. Tôi muốn thực hiện bổ sung như trên trường trung học, thêm thứ tự tương ứng và nếu kết quả lớn hơn 10, thêm carry vào thứ tự tiếp theo.

Sau đó, tôi nghĩ rằng nó sẽ là tốt hơn để xử lý nó như là một mảng unsigned dài dài int và giữ cho các dấu hiệu cách nhau bằng bool. Với điều này tôi sợ kích thước của int, như C + + tiêu chuẩn như xa như tôi biết đảm bảo rằng int < float < đôi. Đúng nếu tôi sai. Vì vậy, khi tôi đạt đến một số số tôi nên di chuyển trong mảng về phía trước và bắt đầu thêm số vào vị trí mảng tiếp theo.

Có cấu trúc dữ liệu nào phù hợp hoặc tốt hơn cho điều này không?

+0

Âm thanh như một sự triển khai hợp lý với tôi. Nhưng nếu bạn đang sử dụng ULONG, mỗi phần tử trong mảng có thể chứa một giá trị từ 0 đến 2^32-1 thay vì từ 0 đến 10. Điều đó sẽ giúp bạn tiết kiệm một vài byte. :-) –

+1

Tiêu chuẩn chỉ đảm bảo 'float <= double' (lưu ý dấu bằng) – ipc

+0

Vâng đó chính là ý của tôi. Nhưng là 2^32-1 tương tự trên linux và trên solaris? Tương ứng là kích thước đảm bảo ở khắp mọi nơi? Quan điểm của tôi là, ví dụ tôi nhận được số MyBigIntClass = "234567434256547"; , và tôi bắt đầu chuyển đổi số chuỗi này thành biểu diễn bên trong của tôi trong lớp được gán dài dài int (có thể :-)), và sau khi số đạt đến 2^32, tôi di chuyển đến vị trí khác trong mảng. Nó có đúng không? – user1086004

Trả lời

5

Vì vậy, bạn muốn có một mảng động các số nguyên có kích thước nổi tiếng?

Âm thanh như vector<uint32_t> sẽ phù hợp với bạn.

+0

tiếc là STL không được phép – user1086004

+2

bài tập về nhà? nhúng? Trong mọi trường hợp, bạn sẽ cần một cái gì đó như 'vector'. May mắn thay, đó là một bài tập đơn giản để tái tạo một mảng động cơ bản." – Joni

2

Như bạn đã biết, bạn sẽ cần phải sử dụng các loại cụ thể trong nền tảng của mình (hoặc ngôn ngữ nếu bạn có C++ 11) có kích thước cố định. Một thực hiện phổ biến của số lượng lớn sẽ sử dụng số nguyên 32 bit và đảm bảo rằng chỉ có 16 bit thấp hơn được thiết lập. Điều này cho phép bạn hoạt động trên các số (trong đó chữ số sẽ là [0..2^16)) và sau đó bình thường hóa kết quả bằng cách áp dụng giá trị mang theo.

+0

Để thêm/chất nền, việc thực hiện có thể được thực hiện trên đường đi và bạn không cần hai lần. Cho phép nhân, nó phụ thuộc vào thuật toán, nhưng nếu bạn đang sử dụng các phương thức FFT điểm nổi, bạn không cần mang theo quá (nhưng tốt hơn là sử dụng 16 bit "chữ số" vì bạn sẽ tích lũy lỗi roundoff trong FFT) –

2

Trên nền tảng x86 64 bit hiện đại, cách tiếp cận tốt nhất có thể là lưu trữ bigint của bạn dưới dạng mảng được phân bổ động 32 bit, do đó số học của bạn có thể vừa với 64 bit. Bạn có thể xử lý dấu hiệu của bạn một cách riêng biệt, như là một biến thành viên của lớp, hoặc bạn có thể sử dụng số học bổ sung 2 (đó là cách signed int 's thường được đại diện).

Chuẩn C <stdint.h> bao gồm tệp định nghĩa uint32_tuint64_t, vì vậy bạn có thể tránh các loại số nguyên phụ thuộc vào nền tảng. Hoặc, (nếu nền tảng của bạn không cung cấp những thứ này), bạn có thể tự biến đổi và xác định loại điều này - tốt nhất là trong một tệp riêng biệt "platform_dependent.h" ...

+0

Bổ sung 2-s không phải là dễ dàng để làm cho bigints năng động chiều dài (và không mua nhiều), nhưng Tôi đồng ý với phần còn lại. – Sopel

Các vấn đề liên quan