Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Khai báo số lớn ~ 10 mũ 18 như thế nào?

  1. #1
    Ngày gia nhập
    09 2010
    Bài viết
    11

    Wink Khai báo số lớn ~ 10 mũ 18 như thế nào?

    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++

    Code:
    #include<iostream>
    #include<fstream>
    using namespace std;
    
    int main()
    {   
        long long n=1000000000000000000;
        cout<<n;
        system("PAUSE");    
        return 0;
    }
    thì máy báo lỗi là:
    In function `int main()':
    integer constant is too large for "long" type
    Có bác nào giúp mình khai báo trường hợp số lớn này cái.

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    160

    bạn khai báo
    C Code:
    1. long long n=1000000000000000000LL;

    hoặc đơn giản hơn
    C Code:
    1. 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 )

  3. #3
    Ngày gia nhập
    03 2010
    Nơi ở
    Nơi nào đó trong vũ trụ
    Bài viết
    550

    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!

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi birthis Xem bài viết
    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.
    "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:
    1. cout << sizeof(long long) << endl;

  5. #5
    Ngày gia nhập
    03 2010
    Nơi ở
    Nơi nào đó trong vũ trụ
    Bài viết
    550

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    "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:
    1. cout << sizeof(long long) << endl;
    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!

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Mặc định Khai báo số lớn ~ 10 mũ 18 như thế nào?

    Trích dẫn Nguyên bản được gửi bởi birthis Xem bài viết
    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) ?
    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 long Cò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 )

Các đề tài tương tự

  1. Hàm trong C++ Thắc mắc khai báo nguyên mẫu hàm như thế này nghĩa là gì?
    Gửi bởi cuatinhyeu34 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 15-11-2012, 09:25 PM
  2. Lập trình C++ khai báo và sử dụng con trỏ hàm như thế nào???
    Gửi bởi dangvanhoavc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 30-04-2011, 10:09 PM
  3. Lập trình C Thắc mắc về khai báo protoype và các hàm liên quan khi khai báo!
    Gửi bởi ganhim trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 15
    Bài viết cuối: 10-08-2010, 02:03 PM
  4. Khai báo hàm thế này nên hiểu như thế nào, xin các bạn giúp đỡ.!!!
    Gửi bởi hoangtiencdt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 26-08-2009, 10:38 AM
  5. Khai báo biến local, thế mà dùng được cả global, thế này là sao?
    Gửi bởi Loveanygirls trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 01-05-2009, 10:32 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn