Em đang làm bài tập lớn về C++, đó là xây dựng các phép toán trên số nguyên cực lớn. Em đã làm được các phép toán +,-,*, còn phép chia em không sửa được, anh chị nào xem và góp ý dùm em.
Phép chia em chỉ thực hiện được ở hai trường hợp:
1. Số chữ số của số chia và số bị chia là bằng nhau
2. Số chia và số bị chia có một chữ số.
Các hàm con em đã test kỹ, giải thuật phép chia của em là trừ dần cho đến khi nào nhỏ hơn số bị chia thì dừng. Mong anh chị giúp em !
Code:
/* Nguyen Thanh Huy - DHTH4*/
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<iostream.h>
#include<fstream.h> 
using namespace std;
typedef int elementtype;
/* Khai bao cau truc nut: */
typedef struct node{
        elementtype element;
        struct node* next;
        struct node* prev;
        node(elementtype x)
            {
                this->element=x;
                this->next=NULL;
                this->prev=NULL;
            }
}node;
/* Khai bao class bigint: */
class bigint{
      private:
              int sign;
              int len;
              node *first;
              node *last;
      public:
             bigint();
             ~bigint();
             void insertlast(elementtype);
             void insertfirst(elementtype);
             bool empty();
             void input(char*);
             void input(string st);
             void print();
             friend int  max_unsigned(bigint *, bigint *);
             friend int  max(bigint *, bigint *);
             friend bigint* add1(bigint *, bigint *);
             friend bigint* add(bigint *, bigint *);
             friend bigint* sub1(bigint *, bigint *);
             friend bigint* sub(bigint *, bigint *);  
             friend bigint* mul1(bigint *, node *); 
             friend bigint* mul(bigint *, bigint *);
             friend bigint* divi(bigint *,bigint *);
             friend bigint* mod(bigint *, bigint *);
             void proccessfromfile();
             friend void biginttofile(bigint *);
             
};
void biginttofile(bigint *a){
    ofstream f("Output.txt");
    if(a->sign==-1) f<<'-';
    node *p=a->first;
    while(p!=NULL) 
     { 
        f<<p->element;
        p=p->next;
     }
    f.close();
    cout<<"\n Da ghi ket qua ra file Output.txt\n";
}
bigint * divi(bigint *a, bigint *b){
    bigint *c=new bigint();
    bigint *a_temp=new bigint();
    bigint *mot=new bigint();
    mot->insertfirst(1);
    int sign;
    if(a->sign!=b->sign) sign=-1; else sign=1;
    a_temp=a;
    while(max_unsigned(a_temp,b)!=-1)
                                {
                                      c=add1(c,mot);
                                      a_temp=sub1(a_temp,b);
                                      cout<<"\n/*********************/\n";
                                      cout<<"\n a = "; a_temp->print();
                                      cout<<"\n b = "; b->print();
                                      cout<<"\n c = "; c->print();
                                      cout<<"\n max_unsigned(a_temp,b) = "<<max(a_temp,b);
                                      cout<<"\n Dau cua a = "<<a->sign;
                                      cout<<"\n Dau cua b = "<<b->sign;
                                      cout<<"\n Dau cua c = "<<c->sign;
                                      getch();
                                                                                   
                                }
    c->sign=sign; 
    return c;
}
bigint * mod(bigint *a, bigint *b){
    bigint *c=new bigint();
    bigint *mot=new bigint();
    string s; s[0]='1'; mot->input(s);
    int sign=a->sign;
    if(max_unsigned(a,b)!=-1)
    while(max_unsigned(a,b)!=-1)
                                {
                                      c=add1(c,mot);
                                      a=sub1(a,b);
                                }
    a->sign=sign;
    return a; 
}
/* Chuyen chuoi vao so nguyen kieu bigint: */
void bigint::input(string st){
     int i=0;
     elementtype temp;
     char c;
     if(st[0]=='-') 
		{
			this->sign=-1; 
			i=1;  
		}
     else 
		{
			this->sign=1; 
			i=0; 
		}
     while(st[i]!='\0')
         {
             if((st[i]<'0')&&(st[i]>'9')) { cout<<" Loi du lieu dau vao !"; break; }
             c=st[i];
             temp=atoi(&c);
             this->insertlast(temp);
             i++;
         }
  
};
/* Tinh toan so duoc luu trong file : */
void processingfromfile(){
     bigint *a=new bigint();
     bigint *b=new bigint();
     bigint *c=new bigint();
     bigint *du=new bigint();
     string st1,st2;
     char pt;
     ifstream f("Input.txt");
     f>>st1;
     f>>pt;
     f>>st2;
  //   f.close();
     a->input(st1);
     b->input(st2);
     a->print();
     b->print();
     switch(pt){
                case '+': c=add(a,b); break;
                case '-': c=sub(a,b); break;
                case '*': c=mul(a,b); break;
                case '/': c=divi(a,b); break;
                default: break;
                }
     cout<<"\n Ket qua tinh toan tu file : \n";
     cout<<st1<<" "<<pt<<"  "<<st2<<"  = ";
     c->print();
     if(pt='/') {du=mod(a,b); du->print();}
};
/*-----------------------------------------------------*/
bigint::bigint(){
	 first=last=NULL;
	 len=0;
};
/*-----------------------------------------------------*/
bigint::~bigint(){
  node *p;
  while(first!=NULL)
	  {
		  p=first;
		  first=first->next;
		  first->prev=NULL;
		  delete p;
	  }         
  first=last=NULL;
  len=0;       
}; 
/*-----------------------------------------------------*/
bool bigint::empty(){
     if(first==NULL) return true; 
		else return false;
};
/*-----------------------------------------------------*/
void bigint::insertlast(elementtype element){
     node *p=new node(element);
     if(empty())
     first=last=p;
		 else
			 {
				 last->next=p;
				 p->prev=last;
				 last=p;
			 }
     len++;
};
/*-----------------------------------------------------*/
void bigint::insertfirst(elementtype element){
     node *p=new node(element);
     if(empty())
     first=last=p;
		 else
			 {
				 p->next=first;
				 first->prev=p;
				 first=p;
			 }
     len++;
};  
/*-----------------------------------------------------*/
void bigint::input(char* str){
     string st;
     int i=0;
     elementtype temp;
     char c;
     cout<<str;
     cin>>st;
     if(st[0]=='-') 
		{
			this->sign=-1; 
			i=1;  
		}
     else 
		{
			this->sign=1; 
			i=0; 
		}
     while(st[i]!='\0')
         {
             if(st[i]>'9') { cout<<" Loi du lieu dau vao !"; break;}
             c=st[i];
             temp=atoi(&c);
             this->insertlast(temp);
             i++;
         }
  
};
 /*----------------------Khi a,b>=0-------------------------------*/
 bigint * add1(bigint *a, bigint *b)
 {
    node *p=a->last; 
    node *q=b->last; 
    bigint *c=new bigint();  
    int s1,s2,nho=0; 
    while(p!=NULL && q!=NULL) 
        { 
            s1=p->element+q->element+nho; 
            s2=s1%10; 
            if(p==a->first && q==b->first) 
				{ 
					c->insertfirst(s1); 
				} 
            else 
				{ 
					c->insertfirst(s2);
				} 
            nho=s1/10; 
            p=p->prev; 
            q=q->prev; 
        } 
    while(p!=NULL) 
        { 
            s1=p->element+nho; 
            s2=s1%10; 
            if(p==a->first) 
				{ 
					c->insertfirst(s1); 
				} 
            else 
				{ 
					c->insertfirst(s1); 
				} 
            nho=s1/10; 
            p=p->prev; 
        } 
    while(q!=NULL) 
        { 
            s1=q->element+nho; 
            s2=s1%10; 
            if(q==b->first) 
				{ 
					c->insertfirst(s1);
				} 
            else 
				{ 
					c->insertfirst(s2); 
				} 
            nho=s1/10; 
            q=q->prev; 
        } 
    c->sign=1; 
    return c; 
};
/*--------------------Khi a>=b---------------------------------*/
bigint * sub1(bigint *a, bigint *b){
       bigint *c=new bigint();
       int s,k=0;
       node *p=a->last;
       node *q=b->last;
       while(p!=NULL&&q!=NULL)
           {
               s=p->element-q->element-k;
               if(s<0) 
                    { 
                        c->insertfirst(10+s); 
                        k=1; 
                    } 
                else 
                    { 
                        c->insertfirst(s); 
                        k=0; 
                    } 
                p=p->prev; 
                q=q->prev; 
            } 
    while(p!=NULL) 
        { 
            s=p->element-k; 
            if(s<0) 
                { 
                    c->insertfirst(10+s); 
                    k=1; 
                } 
            else 
                { 
                    c->insertfirst(s); 
                    k=0; 
                } 
            p=p->prev; 
        } 
    return c; 
};
/*--------------So sanh khong dau------------------------*/       
int max_unsigned(bigint *a, bigint *b){
    if(a->len>b->len) return 1; // a>b tra ve 1
    if(a->len<b->len) return -1; // a<b tra ve -1
    else
		{
			node *p=a->first;
			node *q=b->first;
			while(p!=NULL&&q!=NULL)
				 {
					 if(p->element>q->element) return 1;
						else 
						   if(p->element<q->element) 
							  return -1;  
						   return 0;
					 p=p->next;
					 q=q->next;
				 }                
		}
};       

/*--------------So sanh co dau------------------------*/
int max(bigint *a, bigint *b)
{
    if(a->sign!=-1&&b->sign==-1) return 1;
    if(a->sign==-1&&b->sign!=-1) return -1;
    if(a->sign==-1&&b->sign==-1)
        {
            if(max_unsigned(a,b)==1) return -1;
            else if(max_unsigned(a,b)==0) return 0;
            else if(max_unsigned(a,b)==-1) return 1;
        }
    if(a->sign!=-1&&b->sign!=-1)
        {
            if(max_unsigned(a,b)==1) return 1;
            else if(max_unsigned(a,b)==0) return 0;
            else if(max_unsigned(a,b)==-1) return -1;
        }
    return 0;
} 
/*-----------------------------------------------------*/ 
bigint * add(bigint *a, bigint *b){
       int k=max_unsigned(a,b);
       bigint *c=new bigint();
       // Truong hop a,b>=0:
       if(a->sign==1&&b->sign==1)
		   {
				c=add1(a,b); 
				c->sign=1;
			}
       //Truong hop a,b<0:
       if(a->sign==-1&&b->sign==-1)
		   {
			   c=add1(a,b); 
			   c->sign=-1;
		   }
       //Truong hop a>=0, b<0:
       if(a->sign==1&&b->sign==-1)
		   {
									  if(k==1)
										  {
											  c=sub1(a,b); 
											  c->sign=1;
										  }
									  else if(k==0) 
											{
												c=sub1(a,b); 
												c->sign=1;
											}
											else if(k==-1) 
													{
														c=sub1(b,a); 
														c->sign=-1;
													}
		   }
       //Truong hop a<0, b>=0:
       if(a->sign==-1&&b->sign==1)
		   {
			   if(k==1){c=sub1(a,b); c->sign=-1;}
			   else {c=sub1(b,a); c->sign=1;}
		   }
       return c;
}
/*-----------------------------------------------------*/ 
bigint * sub(bigint *a, bigint *b){
    bigint *c=new bigint();
    bigint *d=new bigint();
    node *p;
    int sign_temp=b->sign;
    for(p=b->last;p!=NULL;p=p->prev)
		d->insertfirst(p->element);
    d->sign=-sign_temp;
    c=add(a,d);
    return c;
};
/*--------------------Nhan 1 so 1 chu so cho 1bigint----------------------------*/ 
bigint * mul1(bigint *a, node *p){
       int n=0       ,s=0;
       bigint *c=new bigint();
       node *q;
       for(q=a->last;q!=NULL;q=q->prev)
		   {
			   s=(q->element)*(p->element)+n;
			   n=s/10;
			   c->insertfirst(s%10);
		   }
       if(n!=0) c->insertfirst(n);
       c->sign=1;
       return c;
}
/*-----------------------------------------------------*/
bigint *mul(bigint *a, bigint *b){
       bigint *c=new bigint();
       bigint *temp=new bigint();
       node *i,*j;
       for(i=b->last;i!=NULL;i=i->prev)
			{
			   j=b->last;
			   temp=mul1(a,i);
			   while(j!=i) 
					{
						temp->insertlast(0); 
						j=j->prev;
					}
			   c=add1(c,temp);
		   }
       if(a->sign*b->sign==1) c->sign=1; else c->sign=-1;
       return c;
}
 void bigint::print(){
      if(this->sign==-1) cout<<"-";
      node *p;
      node *q=this->first;
      while(q!=NULL&&q->element==0)
			q=q->next;
      if(q==NULL) cout<<0;
      for(p=q;p!=NULL;p=p->next)
			cout<<p->element;
      cout<<endl;
};
/*-----------------------------------------------------*/

int main()
{
    bigint *c=new bigint();
    bigint *d=new bigint();
    int x;
    cout<<" 1. Nhap du lieu tu ban phim\n";
    cout<<" 2. Nhap du lieu tu file Input.txt\n";
    cout<<" Nhap lua chon: ";
    cin>>x;
    switch(x){
              case 1:
                   {
                        bigint *a=new bigint();
                        bigint *b=new bigint();
                        bigint *c=new bigint();
                        a->input(" - Nhap a = ");
                        b->input(" - Nhap b = ");
                        cout<<"\n Tong hai so : ";
                        c=add(a,b);
                        c->print(); 
                        cout<<"\n Hieu hai so : ";
                        c=sub(a,b);
                        c->print();
                        biginttofile(c);
                        cout<<"\n Tich hai so : ";
                        c=mul(a,b);
                        c->print(); 
                        cout<<"\n Phep chia: ";
                        c=divi(a,b);
                        cout<<"\n Phan nguyen :";
                        c->print();
                        d=mod(a,b);
                        cout<<"\n Phan du : ";
                        d->print();
                   }; 	break;
              case 2:
						processingfromfile(); break;
              default: cout<<" Thao tac chon sai ! "; break;} 
    
    getch();
    return 0;    
}