Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: Lớp tính toán với số nguyên lớn bằng C++. Mong mọi người đóng góp ý kiến nhé

  1. #1
    Ngày gia nhập
    12 2007
    Bài viết
    54

    Wink Lớp tính toán với số nguyên lớn bằng C++. Mong mọi người đóng góp ý kiến nhé

    C++ Code:
    1. /* Viet chuong trinh viet 1 lop so nguyen lon */
    2. # include<iostream.h>
    3. # include<string.h>
    4. # include<stdio.h>
    5. class BigInt
    6.  {   private:
    7.             char giatri[50];
    8.             int dau;
    9.  
    10.      public:
    11.             BigInt();
    12.             void tong(BigInt a,BigInt b);
    13.             void in();
    14.  
    15.  };
    16.  
    17.  BigInt::BigInt()
    18.  {    int do_dai,kt=0;    // kt=0 so nhap vao la dung
    19.         char s[50];
    20.         do{   printf("\n Nhap so nguyen lon ");
    21.                 gets(s);
    22.                 do_dai=strlen(s);
    23.  
    24.                 for( int i=0;i<do_dai;i++)       // kiem tra dieu dien so nhap vao
    25.                  if(s[i]<'0'||s[i]>'9')
    26.                     if(s[0]!='-')
    27.                             kt=1;               // ha co neu vi pham dieu dien
    28.             }
    29.         while(kt==1);
    30.         strcpy(giatri,s);                     // xet dau cua so
    31.         if(giatri[0]=='-')
    32.                   {   dau='-';
    33.                          for(int i=0;i<do_dai;i++)
    34.                          giatri[i]=giatri[i+1];
    35.                   }
    36.         else
    37.                          dau=' ';
    38. }
    39. void BigInt::tong(BigInt a,BigInt b)
    40.  {   int n,nho=0;
    41.       int n1=strlen(a.giatri);
    42.       int n2=strlen(b.giatri);
    43.       if(n1>n2)
    44.             n=n1;
    45.       else
    46.             n=n2;
    47.       for(int i=0;i<n;i++)
    48.               {
    49.                     giatri[n-1-i]=((a.giatri[n1-1-i]-'0')+(b.giatri[n2-1-i]-'0')+nho)%10+'0';
    50.                     nho=((a.giatri[n1-1-i]-'0')+(b.giatri[n2-1-i]-'0')+nho)/10;
    51.  
    52.               }
    53.  }
    54. void BigInt::in()
    55.  {
    56.         printf("\n so nguyen lon la :%c",dau);
    57.         puts(giatri);
    58.  
    59.  }
    60.  
    61.  void main()
    62.  {
    63.         BigInt p,q;
    64.         p.in();
    65.         q.in();
    66.         p.tong(p,q);
    67.         p.in();
    68.  }
    Bài của mình còn 1 số hạn chế sau :
    1) ko thể nhập dấu cách vào đầu và cuối số
    2) vẫn chưa tính được tổng của 2 số trong 2 trường sau
    1 2 3 4 5
    + 3 4 2
    in ra kết quả sai do số thứ 2 thiếu số
    1 4 5 6 7
    + 8 9 6 5 3
    vẫn chưa làm được do phải tăng thêm kích thước của mảng kí tự
    Mong mọi người đóng góp ý kiến nhé . Thanks a lot
    Rất mong được mọi người giúp đỡ :

    Kiến thức mình biết chỉ là hạt cát trên sa mạc

  2. #2
    Ngày gia nhập
    04 2008
    Bài viết
    336

    123 + 1 = '*4 .... -123 + 123 = -246 ...
    nói chung là sai nhiều trường hợp ....
    mình nghĩ bạn nên làm theo kiểu convert sang số rồi áp dụng như hồi lớp 1 ấy
    vd: 9+1 = 10 viết 0 nhớ 1 v.v..
    code ra gió bão

  3. #3
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    123 + 1 = '*4 .... -123 + 123 = -246 ...
    nói chung là sai nhiều trường hợp ....
    mình nghĩ bạn nên làm theo kiểu convert sang số rồi áp dụng như hồi lớp 1 ấy
    vd: 9+1 = 10 viết 0 nhớ 1 v.v..
    tốt nhất cậu nên nhập ở chế độ mảng các số thực đi,như thế là dễ tính nhất

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    uhm, đúng rồi đó. Bạn cứ cộng như bình thường, nếu vượt quá giới hạn thì chuyển sang phần tử kế tiếp. Ví dụn 65539 vượt qua khỏi số 2 byte, thì bạn tách thành 2 số 2 byte là 3 và 1
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 20-09-2008 lúc 09:48 AM.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    uhm, đúng rồi đó. Bạn cứ cộng như bình thường, nếu vượt quá giới hạn thì chuyển sang phần tử kế tiếp. Ví dụn 65539 vượt qua khỏi số 2 byte, thì bạn tách thành 2 số 2 byte là 3 và 1
    không cần thế đâu,mình có cách này nhé
    mảng A là số lớn thứ nhất
    mảng B là số lớn thứ 2
    mảng C là kết quả
    A[i]+B[i] + du[i]= C[i]
    nếu mà C[i] >10 thì C[i] = C[i] -10;
    và du[i+1] =1;
    với mảng du[i] là phần dư của phép cộng
    Đã được chỉnh sửa lần cuối bởi AlexF : 20-09-2008 lúc 09:53 AM. Lý do: dư thứ nhất = 0

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định Lớp tính toán với số nguyên lớn bằng C++. Mong mọi người đóng góp ý kiến nhé

    Mình muốn nói về cách thức lưu trữ số nguyên lớn vào mảng thôi, còn cách toán tử trên số nguyên lớn có nhiều cách hiệ thực lắm.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  7. #7
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Mình muốn nói về cách thức lưu trữ số nguyên lớn vào mảng thôi, còn cách toán tử trên số nguyên lớn có nhiều cách hiệ thực lắm.
    nếu vậy thì lưu mỗi chữ số là 1 phần tử của mảng, VD A[1] là số thứ nhất A[iư là số thứ i

  8. #8
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Cách lưu này dễ tính toán nhưng lại tốn bộ nhớ, ko tối ưu về mặt lưu trữ.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  9. #9
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Cách lưu này dễ tính toán nhưng lại tốn bộ nhớ, ko tối ưu về mặt lưu trữ.
    Mình đề xuất ý này không biết khả thi không.
    dùng một mảng kiểu char lưu.
    kiểu char( 1 byte lưu được số tối đa là 127), do đó chúng ta kiếm cách lưu trử như sau:
    với mỗi phần tử sẽ cho nó số lớn nhất mà nó có thể làm được.
    phần tử A[0] sẽ lưu một giá trị nào đó là 0 hoặc 1. với qui ước là : 0 là số Âm, 1 là số dương. (ko biết có số bê đê ko ta. nếu có thì pó hand )
    ví dụ: có số. 128796541231271110
    mảng char sẽ là:
    i 1 2 3 4 5 6 7 8
    A[i] 12 87 96 54 123 127 111 0

    do chọn mảng kiếu là char nên có thể tính toán được dễ dàng hơn là chọn với kiểu khác (nó lưu được số nhỏ hơn. dễ tính toán hơn).

    tuy nhiên với cách này thì có một nhược điểm là tốn chi phí khi tách chuổi.
    do phải kiểm tra nhiều lần.

    được một ưu điểm là ít tốn bộ nhớ lưu trữ hơn, và cũng dễ dàng hơn khi lưu tính toán so với cách này mà lưu trữ bằng kiểu khác.
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 20-09-2008 lúc 11:17 AM.

  10. #10
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Cách lưu trữ tốt nhất vẫn là cố gắng làm theo cách lưu của các kiểu số : long 4 byte, short 2 byte .... Tính toán thì cũng khá dễ, để khi nào mình rảnh mình sẽ post lên cho mọi người tham khảo.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

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

  1. Tổng hợp ôn thi môn Giải thuật kính mong anh em đóng góp
    Gửi bởi kaiyo trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 27-05-2010, 01:45 PM
  2. hỏi về multithread..Rất mong có sự đóng góp ý kiến (P2)
    Gửi bởi cakiempc trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 31-10-2007, 11:55 AM
  3. hỏi về multithread..Rất mong có sự đóng góp ý kiến
    Gửi bởi cakiempc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 27-10-2007, 11:55 AM
  4. Mời Các bạn vào đóng góp ý kiến nha
    Gửi bởi devilsleep trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 19-10-2007, 05:36 PM

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