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

1. ## 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. 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 = 0 ); /*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; /*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; i <= 29; i++ ){            INT[i] = 0;      }          for ( int j = 29; value != 0 && j >= 0; j-- ){            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; i <= 29; i++ ){            INT[i] = 0;      }      /*place digits of arguement into array*/      int length = strlen ( string );            for ( int j = 30 - length, k = 0; j <= 29; j++, 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; i >= 0; i-- ){            tmpVal.INT[i] = INT[i] + Obj.INT[i] + carry;                  /*Examine whether to carry a "1"*/            if ( tmpVal.INT[i] > 9 )            {                  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 ^^*/ostream& operator << ( ostream &output, const HugeInt &num ){      int i;            for ( i = 0; (num.INT[i] == 0 ) && ( i <= 29 ); i++ )            ; /*Keep leading stupid zeros^^*/            if ( i == 30 )                  output << 0;            else                  for (; i <= 29; i++ )                        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 << " + "           << 9 << " = "           << 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. 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. 4. Ý 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. 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 đó  6. ## 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. 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. 8. 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. 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. 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)  