PDA

Xem Bản Đầy Đủ : Chương trình xử lý số nguyên lớn



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

chuvanhuy
07-05-2007, 18:09
Anh nên lưu ở dạng File. Rồi Upload lên một Site nào đó rồi gửi đường dẫn cho chúng em. Như vậy bài sẽ không bị biến dạng. Sẽ tiện hơn cho việc tham khảo!
Cảm ơn anh đã cho chúng em nhiều thông tin bỏ ích về bài toán tính số nguyên lớn.

nhatviethuy
07-05-2007, 21:39
Oh zea =D>
Nhìn bài này thấy ngại quá đi :-?
Mod của box này đâu nhỉ ? Convert nó sang dạng class and method giúp pà con cái =D> =D>