truongnx_cnt45dh
07-05-2007, 17:51
Lớp chúng ta đang làm bài tâp môn C++ mình vừa lấy ở trên mạng mã nguồn của một bài toán tính số nguyên lớn. Mã nguồn này viết không phải theo cấu trúc hướng đối tượng nhưng từ thuật toán ở trong bài này các bạn có thể áp dụng nó để cài đặt theo phương pháp hướng đối tượng.
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
struct node{
int info;
node* next;
node* prev; };
typedef node* pnode;
struct List{
int sign;
pnode phead;
pnode ptail; };
pnode getnode(int);
List tong2soduong(List,List);
List tong(List,List,int);
List hieu2soduong(List,List);
List hieu(List,List,int);
List tich_tam(List,pnode);
List tich(List,List,int);
void xuat(List);
void khoitao(List&);
void addtail(List&,pnode);
void addhead(List&,pnode);
void input(List&,char[]);
int so_sanh_tam(char[],char[]);
int so_sanh(char[],char[]);
void main()
{
List l1,l2;
char st1[1001],st2[1001];
printf("Nhap so nguyen thu nhat: ");
fflush(stdin); gets(st1);
printf("Nhap so nguyen thu hai: ");
fflush(stdin); gets(st2);
int ssc=so_sanh_tam(st1,st2);
int ss=so_sanh(st1,st2);
khoitao(l1);
input(l1,st1);
printf(" So thu nhat: ");
xuat(l1);
khoitao(l2);
input(l2,st2);
printf("\n So thu hai: ");
xuat(l2);
int k=-1;
while(k!=5)
{
cout<<"\n\nNhap k de chon phep tinh(1:cong,2:tru,3:nhan,4:so sanh,5:thoat): ";
cin>>k;
switch(k)
{
case 1:
{
printf("\tTong hai so la:");
xuat(tong(l1,l2,ssc));
}
break;
case 2:
{
printf("\tHieu hai so la:");
xuat(hieu(l1,l2,ssc));
}
break;
case 3:
{
printf("\tTich hai so la:");
xuat(tich(l1,l2,ssc));
}
break;
case 4:
{
if(ss==1)
cout<<"\tSo thu nhat > so thu hai";
if(ss==-1)
cout<<"\tSo thu nhat < so thu hai";
if(ss==0)
cout<<"\tSo thu nhat = so thu hai";
}
break;
}
}
}
void khoitao(List &l)
{
l.phead=l.ptail=NULL;
l.sign=1;
}
void input(List &l,char st[])
{
int i;
if(st[0]=='-')
{
l.sign=-1;
i=1;
}
else
{
l.sign=1;
i=0;
}
while(st[i]!='\0')
{
char x=st[i];
int temp=atoi(&x);
pnode p=getnode(temp);
addtail(l,p);
i++;
}
}
void xuat(List l)
{
if(l.sign==-1)
printf("-");
pnode p,q=l.phead;
while(q!=NULL&&q->info==0)
q=q->next;
if(q==NULL)
cout<<0;
for(p=q;p!=NULL;p=p->next)
printf("%d",p->info);
}
pnode getnode(int x)
{
pnode p;
p=new node;
if(p==NULL)
printf("Khong du bo nho. \n");
else
{
p->info=x;
p->next=p->prev=NULL;
}
return p;
}
void addtail(List &l,pnode p)
{
if(l.phead==NULL)
l.phead=l.ptail=p;
else
{
l.ptail->next=p;
p->prev=l.ptail;
l.ptail=p;
}
}
void addhead(List &l,pnode p)
{
if(l.phead==NULL)
l.phead=l.ptail=p;
else
{
p->next=l.phead;
l.phead->prev=p;
l.phead=p;
}
}
List tong2soduong(List l1,List l2)
{
pnode A,p=l1.ptail,k=l2.ptail;
List l;
int s,z,h=0;
khoitao(l);
while(p!=NULL &&k!=NULL)
{
s=p->info + k->info+ h;
z=s%10;
if(p==l1.phead&&k==l2.phead)
{
A=getnode(s);
addhead(l,A);
}
else
{
A=getnode(z);
addhead(l,A);
}
h=s/10;
p=p->prev;
k=k->prev;
}
while(p!=NULL)
{
s=p->info+h;
z=s%10;
if(p==l1.phead)
{
A=getnode(s);
addhead(l,A);
}
else
{
A=getnode(z);
addhead(l,A);
}
h=s/10;
p=p->prev;
}
while(k!=NULL)
{
s=k->info+h;
z=s%10;
if(k==l2.phead)
{
A=getnode(s);
addhead(l,A);
}
else
{
A=getnode(z);
addhead(l,A);
}
h=s/10;
k=k->prev;
}
l.sign=1;
return l;
}
List hieu2soduong(List l1,List l2)
{
List l;
int g,h=0;
pnode A,p=l1.ptail,k=l2.ptail;
khoitao(l);
while(p!=NULL && k!=NULL)
{
g=p->info- h- k->info;
if(g<0)
{
A=getnode(10+g);
addhead(l,A);
h=1;
}
else
{
A=getnode(g);
addhead(l,A);
h=0;
}
p=p->prev;
k=k->prev;
}
while(p!=NULL)
{
g=p->info-h;
if(g<0)
{
A=getnode(10+g);
addhead(l,A);
h=1;
}
else
{
A=getnode(g);
addhead(l,A);
h=0;
}
p=p->prev;
}
return l;
}
List tong(List l1,List l2,int ssc)
{
List l;
khoitao(l);
if(l1.sign==-1 &&l2.sign==-1)
{
l=tong2soduong(l1,l2);
l.sign=-1;
}
if(l1.sign==1 &&l2.sign==1)
{
l=tong2soduong(l1,l2);
l.sign=1;
}
if(l1.sign==1 &&l2.sign==-1)
{
if(ssc==1)
{
l=hieu2soduong(l1,l2);
l.sign=1;
}
else
if(ssc==-1)
{
l=hieu2soduong(l2,l1);
l.sign=-1;
}
else
if(ssc==0)
{
l.sign=1;
l=hieu2soduong(l1,l2);
}
}
if(l1.sign==-1 &&l2.sign==1)
{
if(ssc==1)
{
l=hieu2soduong(l1,l2);
l.sign=-1;
}
else
{
l=hieu2soduong(l2,l1);
l.sign=1;
}
}
return l;
}
List hieu(List l1,List l2,int ssc)
{
List l;
khoitao(l);
l2.sign=-l2.sign;
l=tong(l1,l2,ssc);
return l;
}
List tich_tam(List l,pnode A)
{
int h=0,t;
List lst;
khoitao(lst);
pnode TEMP,p;
for(p=l.ptail;p!=NULL;p=p->prev)
{
t=p->info* A->info+ h;
TEMP=getnode(t%10);
addhead(lst,TEMP);
h=t/10;
}
if(h!=0)
{
TEMP=getnode(h);
addhead(lst,TEMP);
}
lst.sign=1;
return lst;
}
List tich(List l1,List l2,int ssc)
{
List lst,temp;
khoitao(lst);
pnode run,k,A;
khoitao(temp);
for(k=l2.ptail;k!=NULL;k=k->prev)
{
run=l2.ptail;
temp=tich_tam(l1,k);
while(run!=k)
{
A=getnode(0);
addtail(temp,A);
run=run->prev;
}
lst=tong(lst,temp,ssc);
}
if(l1.sign*l2.sign>0)
lst.sign=1;
else
lst.sign=-1;
return lst;
}
int so_sanh_tam(char st1[],char st2[])
{
int len1,len2,i=0,j=0;
if(st1[0]=='-')
i=1;
if(st2[0]=='-')
j=1;
len1=strlen(st1)-i;
len2=strlen(st2)-j;
if(len1>len2)
return 1;
else
if(len1<len2)
return -1;
else
{
for(int k=0;k<len1;k++)
if(atoi(&st1[k+i])>atoi(&st2[k+j]))
return 1;
else
if(atoi(&st1[k+i])<atoi(&st2[k+j]))
return -1;
return 0;
}
}
int so_sanh(char st1[],char st2[])
{
if(st1[0]!='-' &&st2[0]=='-')
return 1;
if(st1[0]=='-' &&st2[0]!='-')
return -1;
if(st1[0]=='-' &&st2[0]=='-')
{
if(so_sanh_tam(st1,st2)==1)
return -1;
else
if(so_sanh_tam(st1,st2)==0)
return 0;
else
if(so_sanh_tam(st1,st2)==-1)
return 1;
}
if(st1[0]!='-' &&st2[0]!='-')
{
if(so_sanh_tam(st1,st2)==1)
return 1;
else if(so_sanh_tam(st1,st2)==0)
return 0;
else if(so_sanh_tam(st1,st2)==-1)
return -1;
}
return 0;
}Chúc các bạn cài đặt thành công
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
struct node{
int info;
node* next;
node* prev; };
typedef node* pnode;
struct List{
int sign;
pnode phead;
pnode ptail; };
pnode getnode(int);
List tong2soduong(List,List);
List tong(List,List,int);
List hieu2soduong(List,List);
List hieu(List,List,int);
List tich_tam(List,pnode);
List tich(List,List,int);
void xuat(List);
void khoitao(List&);
void addtail(List&,pnode);
void addhead(List&,pnode);
void input(List&,char[]);
int so_sanh_tam(char[],char[]);
int so_sanh(char[],char[]);
void main()
{
List l1,l2;
char st1[1001],st2[1001];
printf("Nhap so nguyen thu nhat: ");
fflush(stdin); gets(st1);
printf("Nhap so nguyen thu hai: ");
fflush(stdin); gets(st2);
int ssc=so_sanh_tam(st1,st2);
int ss=so_sanh(st1,st2);
khoitao(l1);
input(l1,st1);
printf(" So thu nhat: ");
xuat(l1);
khoitao(l2);
input(l2,st2);
printf("\n So thu hai: ");
xuat(l2);
int k=-1;
while(k!=5)
{
cout<<"\n\nNhap k de chon phep tinh(1:cong,2:tru,3:nhan,4:so sanh,5:thoat): ";
cin>>k;
switch(k)
{
case 1:
{
printf("\tTong hai so la:");
xuat(tong(l1,l2,ssc));
}
break;
case 2:
{
printf("\tHieu hai so la:");
xuat(hieu(l1,l2,ssc));
}
break;
case 3:
{
printf("\tTich hai so la:");
xuat(tich(l1,l2,ssc));
}
break;
case 4:
{
if(ss==1)
cout<<"\tSo thu nhat > so thu hai";
if(ss==-1)
cout<<"\tSo thu nhat < so thu hai";
if(ss==0)
cout<<"\tSo thu nhat = so thu hai";
}
break;
}
}
}
void khoitao(List &l)
{
l.phead=l.ptail=NULL;
l.sign=1;
}
void input(List &l,char st[])
{
int i;
if(st[0]=='-')
{
l.sign=-1;
i=1;
}
else
{
l.sign=1;
i=0;
}
while(st[i]!='\0')
{
char x=st[i];
int temp=atoi(&x);
pnode p=getnode(temp);
addtail(l,p);
i++;
}
}
void xuat(List l)
{
if(l.sign==-1)
printf("-");
pnode p,q=l.phead;
while(q!=NULL&&q->info==0)
q=q->next;
if(q==NULL)
cout<<0;
for(p=q;p!=NULL;p=p->next)
printf("%d",p->info);
}
pnode getnode(int x)
{
pnode p;
p=new node;
if(p==NULL)
printf("Khong du bo nho. \n");
else
{
p->info=x;
p->next=p->prev=NULL;
}
return p;
}
void addtail(List &l,pnode p)
{
if(l.phead==NULL)
l.phead=l.ptail=p;
else
{
l.ptail->next=p;
p->prev=l.ptail;
l.ptail=p;
}
}
void addhead(List &l,pnode p)
{
if(l.phead==NULL)
l.phead=l.ptail=p;
else
{
p->next=l.phead;
l.phead->prev=p;
l.phead=p;
}
}
List tong2soduong(List l1,List l2)
{
pnode A,p=l1.ptail,k=l2.ptail;
List l;
int s,z,h=0;
khoitao(l);
while(p!=NULL &&k!=NULL)
{
s=p->info + k->info+ h;
z=s%10;
if(p==l1.phead&&k==l2.phead)
{
A=getnode(s);
addhead(l,A);
}
else
{
A=getnode(z);
addhead(l,A);
}
h=s/10;
p=p->prev;
k=k->prev;
}
while(p!=NULL)
{
s=p->info+h;
z=s%10;
if(p==l1.phead)
{
A=getnode(s);
addhead(l,A);
}
else
{
A=getnode(z);
addhead(l,A);
}
h=s/10;
p=p->prev;
}
while(k!=NULL)
{
s=k->info+h;
z=s%10;
if(k==l2.phead)
{
A=getnode(s);
addhead(l,A);
}
else
{
A=getnode(z);
addhead(l,A);
}
h=s/10;
k=k->prev;
}
l.sign=1;
return l;
}
List hieu2soduong(List l1,List l2)
{
List l;
int g,h=0;
pnode A,p=l1.ptail,k=l2.ptail;
khoitao(l);
while(p!=NULL && k!=NULL)
{
g=p->info- h- k->info;
if(g<0)
{
A=getnode(10+g);
addhead(l,A);
h=1;
}
else
{
A=getnode(g);
addhead(l,A);
h=0;
}
p=p->prev;
k=k->prev;
}
while(p!=NULL)
{
g=p->info-h;
if(g<0)
{
A=getnode(10+g);
addhead(l,A);
h=1;
}
else
{
A=getnode(g);
addhead(l,A);
h=0;
}
p=p->prev;
}
return l;
}
List tong(List l1,List l2,int ssc)
{
List l;
khoitao(l);
if(l1.sign==-1 &&l2.sign==-1)
{
l=tong2soduong(l1,l2);
l.sign=-1;
}
if(l1.sign==1 &&l2.sign==1)
{
l=tong2soduong(l1,l2);
l.sign=1;
}
if(l1.sign==1 &&l2.sign==-1)
{
if(ssc==1)
{
l=hieu2soduong(l1,l2);
l.sign=1;
}
else
if(ssc==-1)
{
l=hieu2soduong(l2,l1);
l.sign=-1;
}
else
if(ssc==0)
{
l.sign=1;
l=hieu2soduong(l1,l2);
}
}
if(l1.sign==-1 &&l2.sign==1)
{
if(ssc==1)
{
l=hieu2soduong(l1,l2);
l.sign=-1;
}
else
{
l=hieu2soduong(l2,l1);
l.sign=1;
}
}
return l;
}
List hieu(List l1,List l2,int ssc)
{
List l;
khoitao(l);
l2.sign=-l2.sign;
l=tong(l1,l2,ssc);
return l;
}
List tich_tam(List l,pnode A)
{
int h=0,t;
List lst;
khoitao(lst);
pnode TEMP,p;
for(p=l.ptail;p!=NULL;p=p->prev)
{
t=p->info* A->info+ h;
TEMP=getnode(t%10);
addhead(lst,TEMP);
h=t/10;
}
if(h!=0)
{
TEMP=getnode(h);
addhead(lst,TEMP);
}
lst.sign=1;
return lst;
}
List tich(List l1,List l2,int ssc)
{
List lst,temp;
khoitao(lst);
pnode run,k,A;
khoitao(temp);
for(k=l2.ptail;k!=NULL;k=k->prev)
{
run=l2.ptail;
temp=tich_tam(l1,k);
while(run!=k)
{
A=getnode(0);
addtail(temp,A);
run=run->prev;
}
lst=tong(lst,temp,ssc);
}
if(l1.sign*l2.sign>0)
lst.sign=1;
else
lst.sign=-1;
return lst;
}
int so_sanh_tam(char st1[],char st2[])
{
int len1,len2,i=0,j=0;
if(st1[0]=='-')
i=1;
if(st2[0]=='-')
j=1;
len1=strlen(st1)-i;
len2=strlen(st2)-j;
if(len1>len2)
return 1;
else
if(len1<len2)
return -1;
else
{
for(int k=0;k<len1;k++)
if(atoi(&st1[k+i])>atoi(&st2[k+j]))
return 1;
else
if(atoi(&st1[k+i])<atoi(&st2[k+j]))
return -1;
return 0;
}
}
int so_sanh(char st1[],char st2[])
{
if(st1[0]!='-' &&st2[0]=='-')
return 1;
if(st1[0]=='-' &&st2[0]!='-')
return -1;
if(st1[0]=='-' &&st2[0]=='-')
{
if(so_sanh_tam(st1,st2)==1)
return -1;
else
if(so_sanh_tam(st1,st2)==0)
return 0;
else
if(so_sanh_tam(st1,st2)==-1)
return 1;
}
if(st1[0]!='-' &&st2[0]!='-')
{
if(so_sanh_tam(st1,st2)==1)
return 1;
else if(so_sanh_tam(st1,st2)==0)
return 0;
else if(so_sanh_tam(st1,st2)==-1)
return -1;
}
return 0;
}Chúc các bạn cài đặt thành công