+ Trả lời chủ đề
Kết quả từ 1 tới 3 trong tổng số 3

Chủ đề: Chương trình xử lý số nguyên lớn

  1. #1
    Avatar của truongnx_cnt45dh
    Gia nhập
    05/2007
    Nơi ở
    Hải Phòng
    Bài gởi
    1
    Cảm ơn
    0
    Được cảm ơn 1 lần trong 1 bài viết

    icon_idea Chương trình xử lý số nguyên lớn

    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.

    Code:
    #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

    CÁC CHỦ ĐỀ KHÁC:


  2. Có 1 thành viên cảm ơn truongnx_cnt45dh:


  3. #2
    Super Moderator Avatar của chuvanhuy
    Gia nhập
    05/2007
    Nơi ở
    Hải Phòng
    Bài gởi
    1,158
    Cảm ơn
    301
    Được cảm ơn 1,114 lần/ 268 bài viết
    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.
    Sửa lần cuối bởi chuvanhuy; 07-05-2007 lúc 18:11.

  4. #3
    Avatar của nhatviethuy
    Gia nhập
    05/2007
    Nơi ở
    Việt Nam
    Bài gởi
    169
    Cảm ơn
    42
    Được cảm ơn 20 lần/ 11 bài viết
    Oh zea
    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

+ Trả lời chủ đề

Các chủ đề liên quan

  1. Học ngữ âm - ngữ pháp với Ms.Nguyệt Ca
    Gửi bởi encic trong diễn đàn English for working
    Trả Lời: 0
    Bài mới gởi: 03-03-2010, 09:31
  2. NGUYỄN BÍCH NGỌC thẳng bước vào đại học HARVARD
    Gửi bởi chuvanhuy trong diễn đàn Kỹ năng - Bí quyết
    Trả Lời: 0
    Bài mới gởi: 21-06-2009, 18:16
  3. Nguyên tắc hoạt động của ram
    Gửi bởi cuncon trong diễn đàn Hỗ trợ kỹ thuật
    Trả Lời: 4
    Bài mới gởi: 27-11-2007, 19:05
  4. Mẹo kiểm tra chất lượng máy tính xách tay mới, nguyên bản
    Gửi bởi Giatuvukhi trong diễn đàn Thị trường Phần cứng
    Trả Lời: 1
    Bài mới gởi: 29-06-2007, 17:13
  5. Phần mềm thi trắc nghiệm - Gửi Nguyễn Xuân Trường
    Gửi bởi Giatuvukhi trong diễn đàn Giới thiệu Phần mềm
    Trả Lời: 0
    Bài mới gởi: 24-06-2007, 09:28

Quyền Hạn Gửi Bài

  • Bạn không thể gửi chủ đề mới
  • Bạn không thể gửi trả lời
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài của bạn
Múi giờ GMT +7. Bây giờ là 03:33.
Copyright © 2007 - 2010 CNT45ĐH