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ố 13 kết quả

Đề tài: bài tập của trường phương đông

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

    Smile bài tập của trường phương đông

    em có 1 số đề của trường phương đông ai giúp em giải với
    ( cả giải thích cụ thể nữa nhá )


    bài 1:
    đa thức p(X) = An.x^n+A(n-1).x^(n-1) +....+A1+A0 được lưu trữ trong máy tính dưới dạng 1 danh sách liên kết mà mỗi phần tử của danh sách là một bản ghi có 3 trường lưu trư hệ số ,số mũ, va trương NEXT trơ đến phần tử kế tiếp .Chú ý cách lưu trữ đam bảo thứ tự giảm dần theo số mũ của từng lưu trữ này.
    a> Hãy viết chươnng trình thực hiện được lưu trữ này.
    b>Dựa vào sự cài đặt trên ,viết chương trình con thực hiện việc cộng hai đa thức.
    c> viết chương trình con lấy đạo hàm của đa thức


    bài 2:
    Để lưu trữ một số nguyên lớn , ta co thể dùng danh sách liên kết chứa các chữ số của nó .Hãy tìm cách lưu tru các chữ số của một số nguyên lớn theo ý tưởng trên sao cho việc cộng 2 số nguyên lớn là de dang thực hiện .Viết cương trình con cộng hai số nguyên lớn

    <ok còn nữa nhưng mỏi tay wa' lúc nào em viết nốt
    ai giúp em giải 2 bài này với
    em mới học nên chưa đủ khả năng giúp em nha' >
    thank các bác trước

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Bài số 2 mình giải bằng quá tải toán tử được không ?
    PHP Code:
    #include <iostream>
    using std::endl;
    using std::cout;
    using std::endl;
    #include <fstream>
    using std::ostream;
    #include <iomanip>
    using std::setw;
    #include <cctype> /* isdigit function prototype*/
    #include <string> /*strlen function prototype*/
    class HugeInt 
    {
          
    /*Redefine operator << */
          
    friend ostream &operator << ( ostream &, const HugeInt &);

          public : 
                
    HugeInt long ); /*Conversion or Default constructor*/
                
    HugeInt ( const char* ); /*Conversion constructor*/
                
                /*Addition operator HugeInt + HugeInt*/
                
    HugeInt operator+ ( const HugeInt & );
                
    /*Addition operator : HugeInt + int */
                
    HugeInt operator+ ( int );
                
    /*HugeInt + string that represents large integer value*/
                
    HugeInt operator+ ( const char*);
          private :
                
    short INT[30]; /*Integer array*/
    };


    /*Default/Conversion constructor that converts 
      a long integer into Hugeint Object*/
    HugeInt::HugeInt long value )
    {
          
    /*Initialize all elements to zero*/
          
    for ( int i 0<= 29i++ ){
                
    INT[i] = 0;
          }
        
          for ( 
    int j 29value != && >= 0j-- ){
                
    INT[j] = value 10;
                
    value value 10;
          }
    }

    /*Conversion constructor that converts a character string, 
      representing a large integer into a HugeInt Object*/ 
    HugeInt::HugeInt ( const char *string )
    {
          
    /*Initialize array to zero*/
          
    for ( int i 0<= 29i++ ){
                
    INT[i] = 0;
          }
          
    /*place digits of arguement into array*/
          
    int length strlen ( string );
          
          for ( 
    int j 30 length0<= 29j++, k++ ){
                if ( 
    isdigit string[k] ))
                      
    INT[j] = string[k] - '0';
          }
    }

    /*HugeInt + HugeInt*/
    HugeInt HugeInt::operator + ( const HugeInt &Obj )
    {
          
    /*Temporary result*/
          
    HugeInt tmpVal;
          
          
    int carry 0;
          
          for ( 
    int i 29>= 0i-- ){
                
    tmpVal.INT[i] = INT[i] + Obj.INT[i] + carry;
          
                
    /*Examine whether to carry a "1"*/
                
    if ( tmpVal.INT[i] > )
                {
                      
    tmpVal.INT[i] = tmpVal.INT[i] % 10;
                      
    carry 1
                
    }
                else
                {
                      
    carry 0;
                }
          }
          
    /*return copy of temporary object*/
          
    return tmpVal
    }

    /*HugeInt + Int*/
    HugeInt HugeInt::operator + ( int Obj )
    {
          
    /*convert Ob to a HugeInt then call 
            operator + for 2 HugeInt object*/
          
    return *this HugeInt Obj );
    }


    /*HugeInt + string*/

    HugeInt HugeInt::operator + ( const char *Obj )
    {
          return *
    this HugeInt Obj );
    }

    /*Redefine operator << for convinient purpose ^^*/

    ostreamoperator << ( ostream &output, const HugeInt &num )
    {
          
    int i;
          
          for ( 
    0; (num.INT[i] == ) && ( <= 29 ); i++ )
                ; 
    /*Keep leading stupid zeros^^*/
                
    if ( == 30 )
                      
    output << 0;
                else
                      for (; 
    <= 29i++ )
                            
    output << num.INT[i];
          
          return 
    output;
    }


    int main (void)
    {
          
    HugeInt FIRST 83424914 );
          
    HugeInt SECOND 248141840 );
          
    HugeInt THIRD "192313493225290502");
          
    HugeInt FOURTH "1" );
          
    HugeInt FIFTH;

          
    cout << "\nFIRST is : " << FIRST
               
    << "\nSECOND is : " << SECOND
               
    << "\nTHIRD is : " << THIRD 
               
    << "\nFOURTH is : " << FOURTH
               
    << "\nFIFTH is : " << FIFTH << "\n\n";

          
          
    FIFTH FIRST SECOND;

          
    cout << FIRST << " + " 
               
    << SECOND << " = "
               
    << FIFTH << "\n\n";

          
    cout << THIRD << " + "
               
    << FOURTH << " = "
               
    << ( THIRD FOURTH ) << "\n\n";
          
          
    FIFTH FIRST 7;
          
          
    cout << FIRST << " + "
               
    << << " = "
               
    << FIFTH << "\n\n";
               
               
          
    FIFTH SECOND "999999";
          
    cout << SECOND << " + "
               
    << "999999" << " = "
               
    << FIFTH << "\n\n";
               
          
    system("pause")

    Đã được chỉnh sửa lần cuối bởi rox_rook : 12-11-2007 lúc 11:49 AM.

  3. #3
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Nếu làm như bạn rox_rook thì vẫn còn bị giới hạn số kí tự (chỉ có 30). Bạn có cách nào bỏ cái hạn chế này ko ?

    Mặt khác có nhiều chỗ không hiệu quả :
    + vòng for lặp hơi bị thừa (duyệt từ 0 đến 30 và ngược lại) ở nhiều đoạn code
    + tmpVal.INT[i] = tmpVal.INT[i] % 10; <~~~ thực ra chỉ cần phép trừ là được rồi

    Anyway, phép cộng của bạn "không chính xác" . Xem lại nhé.

    P/s: mấy chỗ khác chưa xem nên ko biết
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 12-11-2007 lúc 11:26 AM.
    Keep moving forward!

    ... Retired ...

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Ý của nhc là cấp phát động cho mãng short phải không nhỉ ? Vòng for thừa nhiều lắm à, hix hix , nhc có cách giải nào hay cho mình tham khảo nhé ! Thanks ^^! hì hì hiểu ý nhc rồi tức là mãng sẽ thay đổi thành chuỗi sẽ không còn giới hạn nữa phải không nhỉ ?
    + tmpVal.INT[i] = tmpVal.INT[i] % 10; <~~~ thực ra chỉ cần phép trừ là được rồi
    nhc có thể giải thích chỗ này được không ?
    Đã được chỉnh sửa lần cuối bởi rox_rook : 12-11-2007 lúc 11:33 AM.

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Hai bài này sử dụng CTDL hiệu quả nhất là Danh sách liên kết, không thôi sẽ rất khó quản lý.

    tmpVal.INT[i] = tmpVal.INT[i] % 10;
    Chỉ cần : tmpVal.INT[i] = tmpVal.INT[i] - 10 là đủ rồi.

    phép cộng của bạn "không chính xác"
    Bạn xem lại biến carry. Nó luôn luôn là 0 đó
    Keep moving forward!

    ... Retired ...

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định bài tập của trường phương đông

    ặc haha ! Sorry type nhầm ^^ ! Cám ơn nhc nhiều nhé ! Do mình chưa được học danh sách liên kết nên ko biết làm ! Nhc có thể giải 2 bài này cho mình tham khảo được không ?

  7. #7
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Oạch, mấy cái này từng là project cuối kì năm 1 của em đó . Bây giờ kêu em làm lại chắc em chết mất. Project mới đầy đầu T__T

    Nếu rox_rook chưa học tới DSLK thì cứ từ từ. Không sao cả. Sau này làm lại bằng DSLK sẽ thấy cái hay của nó.

    P/s: bạn thử giải quyết vấn đề này xem sao : bài của rox_rook ở trên dùng để cộng 2 số nguyên ko dấu, vậy thử với cộng 2 số hugeint có dấu sẽ như thế nào ?

    Regards.
    Keep moving forward!

    ... Retired ...

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    hì hì ! hiểu rồi. Để anh đọc phần đó xem sao, vì bị con trỏ + đối tượng nó quần quá cỡ dạo này chẳng dám coi cấu trúc dữ liệu hix hix ! Dù gì cũng rất cám ơn ý kiến của em nhé ~~!
    ps : để mình suy nghĩ lại bài 1 xem sao nhé !

  9. #9
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Ok tớ sẽ lục lại coi nhớ đã xử bài này rồi. Nhưng mà chỉ có phép Cộng ha ha.
    Sau này làm lại bằng DSLK sẽ thấy cái hay của nó.
    Bài này thì DSLK là đúng rồi.

  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    16

    bài 2 là project mình đã post lên trên forum(mình làm các phep tính cộng, trừ, nhân, chia, mũ của các số nguyên)
    http://forums.congdongcviet.com/showthread.php?t=3519
    mong ý kiến của các bạn.
    nothing is impossible

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