bạn khai báo
C Code:
long long n=1000000000000000000LL;
hoặc đơn giản hơn
C Code:
long long n=1e18;
Dùng cách 2 máy sẽ tự convert double về long long cho bạn (không chậm hơn đâu)
mấy hôm nay làm mấy bài về các số lớn. Mà trong đề bài toàn là cho n (1<=n<=10^18).
Mình dùng DEV-C++
thì máy báo lỗi là:Code:#include<iostream> #include<fstream> using namespace std; int main() { long long n=1000000000000000000; cout<<n; system("PAUSE"); return 0; }
Có bác nào giúp mình khai báo trường hợp số lớn này cái.In function `int main()':
integer constant is too large for "long" type
bạn khai báo
C Code:
long long n=1000000000000000000LL;
hoặc đơn giản hơn
C Code:
long long n=1e18;
Dùng cách 2 máy sẽ tự convert double về long long cho bạn (không chậm hơn đâu)
Nếu đã là "số lớn" thì bạn nên tìm hiểu về cách lưu trữ và xử lý số lớn trong máy tính, chứ dùng các kiểu dữ liệu có sẵn thì sẽ không lưu trữ được chính xác.
p/s: Trên forum có rồi đấy, bạn tìm kiếm thử xem.
Gió thu lạnh lẽo hắt hiu lòng!
"Không lưu trữ được chính xác" phải hiểu thế nào đây? Đề bài đã cho 1 <= n <= 10^18 rồi mà
Mình làm rõ vấn đề này 1 chút:
- theo C/C++ standard long long không được quy định là bao nhiêu byte cả. Nó chỉ được đảm bảo có số lượng bit lớn hơn hoặc bằng long mà thôi (long là 4 byte). Tương tự giữa long double và double
- Tuy nhiên rất nhiều compiler hỗ trợ long long là 8 byte. Trong trường hợp compiler của bạn thuộc dạng này, thì long long sẽ lưu trữ được trong phạm vi 1-> 10^18, đảm bảo chính xác, và tốc độ tính toán chắc chắn cao hơn class Số Lớn nào đó tự implement.
- Bạn có thể kiểm tra rất đơn giản:
C++ Code:
uh, cảm ơn fb nhiều, đã hiểu.. Có 1 điều muốn hỏi fb là nếu như ta cài đặt 1 class số lớn với việc không sử dụng 1 mảng để lưu các chữ số, mà cài đặt 1 đoạn nhớ liên tục với số byte xác định trước là 8 và thực hiện nạp chồng các toán tử thì tốc độ so với kiểu định sẵn long long là như thế nào, có bị chậm hơn nhiều không (cài đặt các phép toán thì tuân theo quy tắc trong kiến trúc máy tính về thực hiện phép toán) ?
Gió thu lạnh lẽo hắt hiu lòng!
Về lý thuyết thì:
- Nếu bạn khai báo lưu trữ 8 byte là 2 DWORD (với system 32 bit)
- Và xem mã assembly dịch ra của các toán tử khi chạy với long long, implement theo y hệt
- Và đặt chế độ optimize để các operator là inline
Thì sẽ đạt được tốc độ tương đương với sử dụng kiểu long longCòn muốn nhanh hơn nó thì không có cửa
Còn dùng mảng các byte/word xử lý trên từng byte/word, thì đương nhiên không đọ được với dùng 2 DWORD (trên system 32 bit) rồi, và chắc chậm hơn kha khá.
Mình không hiểu bạn thắc mắc vấn đề này làm gì nhỉcứ cái gì có sẵn mà phục vụ được nhu cầu thì ta xài thôi
)