Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: [BT][Số nguyên lớn]Biểu diễn số nguyên lớn bằng danh sách liên kế

  1. #1
    Ngày gia nhập
    05 2007
    Nơi ở
    Thềm Xưa
    Bài viết
    44

    Mặc định [BT][Số nguyên lớn]Biểu diễn số nguyên lớn bằng danh sách liên kế

    chào các bạn, minh đang làm bài tính giai thừa của 1 số lớn và phải khai báo bằng danh sách liên kết kép vòng.Mình đang gặp rắc rối ở chỗ khai báo danh sách liên kết.
    Ý tưởng của mình là chuyển 1 số lớn (được nhập vào dạng string) về dạng đa thức VD: 1456 = 1*10^3+4*10^2+5*10^+6.
    các bạn có thể cho minh 1 ý kiến khác hoặc 1 ý kiến phát triển từ ý tưởng của mình ko?
    Nếu có thể thì cho mình xin phần khai báo và tạo danh sách liên kết kép rỗng nhé .
    Mong nhận được sự hồi đáp của các bạn.
    Hãy cùng nhau xây dựng một cộng đồng lớn mạnh

  2. #2
    Ngày gia nhập
    07 2007
    Nơi ở
    can tho
    Bài viết
    1

    Theo tại hạ thì huynh đài nên làm thế này: mỗi ô của danh sách sẽ chứa 3 chữ số. Nghĩa là lấy kết quả chia dư cho 1000, phần nguyên sẽ được công dồn vào ô trước đó. Ý tưởng là vậy nhưng mà làm thế nào thì tại hạ pó tay.
    Ngày mai không biết ra sao nữa,
    Mà có ra sao cũng chảng sao.

  3. #3
    Ngày gia nhập
    06 2007
    Nơi ở
    Hà Nội
    Bài viết
    361

    bài toán này thuộc loại vỡ lòng, trước pascal mình làm đầy, tách từng con số ra: 1456=1000+400+50+6 , 1000 có phải 1*10^3 không, chỉ gợi ý đến thế, chỗ còn lại tự giải quyết
    Blog tổng quan kiến thức về viễn thông : http://tongquanvienthong.blogspot.com/

    mSPDict từ điển android hỗ trợ liên kết tra trên các trình đọc sách điện tử và tra sách giấy thông qua camera
    http://www.tinhte.vn/threads/691731/

  4. #4
    Ngày gia nhập
    05 2007
    Nơi ở
    HCMC
    Bài viết
    60

    Danh sách liên kết vòng cũng là danh sách liên kết kép (Double Linked List) với nút Cuối trỏ vào nút Đầu. Nếu theo ý tưởng của Yuno thì có thể khai báo & khởi tạo như sau:

    1. Khai báo cấu trúc nút & định nghĩa kiểu nút "Node"
    Code:
    struct YunoLnkList        //khai báo 1 cấu trúc tên là... YunoLinkedList
    {
        struct YunoLnkList *prev;  //liên kết đến nút trước
        unsigned char val;            //giá trị of nút
        struct YunoLnkList *next;  //liên kết đến nút sau
    };
    
    typedef struct YunoLnkList Node;
    2. Khởi tạo 1 danh sách rỗng
    Code:
    Node *first;                        //khai báo nút đầu
    first =(Node*)malloc(sizeof(Node));     //cấp phát bộ nhớ cho nút đầu
    first->next = first;           //nút đầu liên kết đến nó (vì nó... lòng vòng)
    first->prev = NULL;

  5. #5
    Ngày gia nhập
    04 2007
    Bài viết
    128

    Ý tưởng là nhập 2 số thiệt dài như 123456789123456789123456789.... chừng bao nhiêu con số tùy bạn khai báo mảng char có bao nhiêu phần tử. Chuyển các phần tử của mảng vào vào danh sách liên kết kép và thực hiện phép cộng hay nhân cho từng 2 nút của DSLKK. Còn đây là phép tính giai thừa tức là nhiều phép nhân, sau khi đã thực hiện dc phép nhân thì mọi chuyện đơn giản rồi. Tham khảo chỗ DSLKK á, đã có xây dựng phép cộng trừ đầy đủ
    http://forums.congdongcviet.com/showthread.php?t=2073
    Đã được chỉnh sửa lần cuối bởi soda_chanhmuoi : 12-07-2007 lúc 08:28 PM.

  6. #6
    Ngày gia nhập
    05 2007
    Nơi ở
    Thềm Xưa
    Bài viết
    44

    Mặc định [BT][Số nguyên lớn]Biểu diễn số nguyên lớn bằng danh sách liên kế

    có thể chó mình xin code đầy đủ được không.?
    Hãy cùng nhau xây dựng một cộng đồng lớn mạnh

  7. #7
    Ngày gia nhập
    04 2007
    Bài viết
    128

    Xử lý số nguyên lớn bằng DSLK kép
    PHP Code:
    #include <time.h>
    #include <stdlib.h>
    typedef long KieuDL;
    typedef struct NUT
    {
        
    struct NUT(long dl)
        {
            
    this->duLieu=dl;
            
    this->tiep=NULL;
            
    this->truoc=NULL;
        }
        
    KieuDL duLieu;
        
    struct NUTtiep;
        
    struct NUTtruoc;
    }
    NUT;
    class 
    DSLKK
    {
        private:
            
    int sign;
            
    NUT *dau;
            
    NUT *cuoi;
        public:
            
            
    DSLKK();
            ~
    DSLKK();
            
    void themNutOCuoi(KieuDL);
            
    void themNutPOCuoi(NUT *);
            
    void themNutODau(KieuDL);
            
    void themNutPODau(NUT *);
            
    void themNutPTruocQ(NUT *,NUT *);
            
    void themNutPSauQ(NUT *,NUT *);
            
    KieuDL demNut(NUT *);
            
    NUT *timNut(KieuDL);
            
    NUT *nutMin();
            
    void layNutP(NUT *);
            
    void xoaNutP (NUT *);
            
    void duyetDSLKKthuan();
            
    void duyetDSLKKnghich();
            
    void huyDSLKK();
            
    bool DSLKKRong();
            
    void quickSort();
            
    void chuyen(char st[]);
            
    void xuat();
    friend DSLKKtongDuong(DSLKK *,DSLKK *);
    friend DSLKKhieuDuong(DSLKK *,DSLKK *);
    friend DSLKKtich_tam(DSLKK*,NUT *);
    friend DSLKKtong(DSLKK *,DSLKK *,int );
    friend DSLKKhieu(DSLKK *,DSLKK *,int);
    friend DSLKKtich(DSLKK *,DSLKK *,int);

    };
    int so_sanh_tam(char st1[],char st2[]);
    int so_sanh(char st1[],char st2[]); 
    PHP Code:
    #include<conio.h>
    #include<stdio.h>
    #include<iostream.h>
    #include<stdlib.h>
    #include<string.h>
    #include"xlsn.h"
    /////////////////////////////////////////////////////////////////////////////////////
    DSLKK::DSLKK()
    {    
    dau=cuoi=NULL;}
    /////////////////////////////////////////////////////////////////////////////////////
    void DSLKK::huyDSLKK()
    {
        
    NUT *p;
        while (
    dau!=NULL)
        {
            
    p=dau;
            
    dau=dau->tiep;
            
    dau->truoc=NULL;
            
    delete p;
        }
        
    cuoi=dau=NULL;
    }
    /////////////////////////////////////////////////////////////////////////////////////
    DSLKK::~DSLKK()
    huyDSLKK();}
    /////////////////////////////////////////////////////////////////////////////////////
    bool DSLKK::DSLKKRong()
    {    return (
    dau==NULL true:false);  }
    /////////////////////////////////////////////////////////////////////////////////////

    void DSLKK::duyetDSLKKthuan()
    {
        
    NUT *p=dau;
        while(
    p!=NULL)
        {
            
    cout<<p->duLieu<<"  ";
            
    p=p->tiep;
        }
    }
    /////////////////////////////////////////////////////////////////////////////////////
    void DSLKK::duyetDSLKKnghich()
    {
        
    NUT *p=cuoi;
        while(
    p!=NULL)
        {
            
    cout<<p->duLieu<<"  ";
            
    p=p->truoc;
        }
    }
    /////////////////////////////////////////////////////////////////////////////////////    
    void DSLKK::themNutOCuoi(KieuDL duLieu)
    {
        
    NUT *p=new NUT(duLieu);
        if(
    DSLKKRong())
            
    dau=cuoi=p;
        else
        {
            
    cuoi->tiep=p;
            
    p->truoc=cuoi;
            
    cuoi=p;
        }
    }
    /////////////////////////////////////////////////////////////////////////////////////
    void DSLKK::themNutODau(KieuDL duLieu)
    {
        
    NUT *p=new NUT(duLieu);
        if(
    DSLKKRong())
            
    dau=cuoi=p;
        else
        {
            
    p->tiep=dau;
            
    dau->truoc=p;
            
    dau=p;
        }
    }
    /////////////////////////////////////////////////////////////////////////////////////
    //chuyen tu mang kieu char vao DSLKK
    void DSLKK::chuyen(char st[])
    {    
        
    int i;
        if(
    st[0]=='-')
        {
            
    this->sign=-1;
            
    i=1;
        }
        else
        {
            
    this->sign=1;
            
    i=0;
        }    
        while(
    st[i]!='\0')
        {
            
    char x=st[i];
            
    KieuDL tam=atoi(&x);
            
    this->themNutOCuoi(tam);
            
    i++;
        }
    }
    /////////////////////////////////////////////////////////////////////////////////////
    void DSLKK::xuat()
    {
        if(
    this->sign==-1)
            
    cout<<"-";
        
    NUT *p;
        
    NUT *q=this->dau;
        while(
    q!=NULL&&q->duLieu==0)
            
    q=q->tiep;
        if(
    q==NULL)
            
    cout<<0;
        for(
    p=q;p!=NULL;p=p->tiep)
            
    cout<<p->duLieu;
        
    cout<<endl;
    }
    /////////////////////////////////////////////////////////////////////////////////////
    DSLKK tongDuong(DSLKK *l1,DSLKK *l2)
    {
        
    NUT *p=l1->cuoi;
        
    NUT *q=l2->cuoi;
        
    DSLKK *l;
        
    l=new DSLKK(); 
        
    int s1,s2,sonho=0;
        while(
    p!=NULL && q!=NULL)
        {
            
    s1=p->duLieu q->duLieusonho;
            
    s2=s1%10;
            if(
    p==l1->dau && q==l2->dau)
            {
                
    l->themNutODau(s1);
            }
            else
            {
                
    l->themNutODau(s2);
            }
            
    sonho=s1/10;
            
    p=p->truoc;
            
    q=q->truoc;
        }
        while(
    p!=NULL)
        {
            
    s1=p->duLieu+sonho;
            
    s2=s1%10;
            if(
    p==l1->dau)
            {
                
    l->themNutODau(s1);
            }
            else
            {
                
    l->themNutODau(s2);
            }
            
    sonho=s1/10;
            
    p=p->truoc;
        }
        while(
    q!=NULL)
        {
            
    s1=q->duLieu+sonho;
            
    s2=s1%10;
            if(
    q==l2->dau)
            {
                
    l->themNutODau(s1);
            }
            else
            {
                
    l->themNutODau(s2);
            }
            
    sonho=s1/10;
            
    q=q->truoc;
        }
        
    l->sign=1;
        return 
    l;
    }
    /////////////////////////////////////////////////////////////////////////////////////

    DSLKK hieuDuong(DSLKK *l1,DSLKK *l2)
    {
        
    DSLKK *l=new DSLKK();
        
    int g,h=0;
        
    NUT *p=l1->cuoi;
        
    NUT *q=l2->cuoi;
        while(
    p!=NULL && q!=NULL)
        {
            
    g=p->duLieu hq->duLieu;
            if(
    g<0)
            {
                
    l->themNutODau(10+g);
                
    h=1;
            }
            else
            {
                
    l->themNutODau(g);
                
    h=0;
            }
            
    p=p->truoc;
            
    q=q->truoc;
        }
        while(
    p!=NULL)
        {
            
    g=p->duLieu-h;
            if(
    g<0)
            {
                
    l->themNutODau(10+g);
                
    h=1;
            }
            else
            {
                
    l->themNutODau(g);
                
    h=0;
            }
            
    p=p->truoc;
        }
        return 
    l;
    }
    /////////////////////////////////////////////////////////////////////////////////////
    DSLKK tong(DSLKK *l1,DSLKK *l2,int SST)
    {
        
    DSLKK *l=new DSLKK();
        if(
    l1->sign==-&&l2->sign==-1)
        {
            
    l=tongDuong(l1,l2);
            
    l->sign=-1;
        }
        if(
    l1->sign==&& l2->sign==1)
        {
            
    l=tongDuong(l1,l2);
            
    l->sign=1;
        }
        if(
    l1->sign==&& l2->sign==-1)
        {
            if(
    SST==1)
            {
                
    l=hieuDuong(l1,l2);
                
    l->sign=1;
            }
            else 
                if(
    SST==-1)
                {    
                    
    l=hieuDuong(l2,l1);
                    
    l->sign=-1;
                }
                else 
                    if(
    SST==0)
                    {            
                        
    l->sign=1;
                        
    l=hieuDuong(l1,l2);
                    }
        }
        if(
    l1->sign==-&& l2->sign==1)
        {
            if(
    SST==1)
            {
                
    l=hieuDuong(l1,l2);
                
    l->sign=-1;
            }
            else 
            {                        
                
    l=hieuDuong(l2,l1);
                
    l->sign=1;
            }
        }
        return 
    l
    }
    /////////////////////////////////////////////////////////////////////////////////////
    DSLKK hieu(DSLKK *l1,DSLKK *l2,int SST)
    {    
        
    DSLKK *l=new DSLKK();
        
    DSLKK *l3=new DSLKK();
        
    NUT *p;
        
    int sign;
        
    sign=l2->sign;
        for(
    p=l2->cuoi;p!=NULL;p=p->truoc)
            
    l3->themNutODau(p->duLieu);
        
    l3->sign=-sign;
        
    l=tong(l1,l3,SST);
        return 
    l;
    }
    /////////////////////////////////////////////////////////////////////////////////////
    DSLKK tich_tam(DSLKK *l,NUT *A)
    {
        
    int h=0,t;
        
    DSLKK *lst=new DSLKK();
        
    NUT *p;
        for(
    p=l->cuoi;p!=NULL;p=p->truoc)
        {
            
    t=p->duLieuA->duLieuh;
            
    lst->themNutODau(t%10);
            
    h=t/10;
        }
        if(
    h!=0)
        {
            
    lst->themNutODau(h);
        }
        
    lst->sign=1;
        return 
    lst;
    }
    /////////////////////////////////////////////////////////////////////////////////////
    DSLKK tich(DSLKK *l1,DSLKK *l2,int SST)
    {
        
    DSLKK *lst=new DSLKK();
        
    DSLKK *temp=new DSLKK();
        
    NUT *run;
        
    NUT *k;
        for(
    k=l2->cuoi;k!=NULL;k=k->truoc)
        {
            
    run=l2->cuoi;
            
    temp=tich_tam(l1,k);
            while(
    run!=k)
            {
                
    temp->themNutOCuoi(0);
                
    run=run->truoc;
            }
            
    lst=tongDuong(lst,temp);
        }
        if((
    l1->sign*l2->sign)==1)
            
    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;

    PHP Code:
    #include<conio.h>
    #include<stdio.h>
    #include<iostream.h>
    #include<stdlib.h>
    #include<string.h>
    #include"xlsn.h"

    void main()
    {
        
    DSLKK *l1=new DSLKK();
        
    DSLKK *l2=new DSLKK();
        
    DSLKK *l=new DSLKK();
        
    char st1[1001],st2[1001];
        
    Nhap:
            
    cout<<"Nhap so nguyen thu nhat: ";
            
    cin>>st1;
            
    cout<<"Nhap so nguyen thu hai:  ";
            
    cin>>st2;
            
    int ssc=so_sanh_tam(st1,st2);
            
    int ss=so_sanh(st1,st2);
            
    l1->chuyen(st1);
            
    cout<<"Nhap so thu nhat: ";
            
    l1->xuat();
            
    l2->chuyen(st2);
            
    cout<<"Nhap so thu hai:  ";
            
    l2->xuat();
            
    int k=-1;
        while(
    k<5)
        {
            
    cout<<"Chon tu 1 den 5"<<endl;
            
    cout<<"1:Cong"<<endl;
            
    cout<<"2:Tru"<<endl;
            
    cout<<"3:Nhan"<<endl;
            
    cout<<"4:So sanh"<<endl;
            
    cout<<"5:Thoat"<<endl;
            
    cout<<"Ban chon:";
            
    cin>>k;
            switch(
    k)
            {
            case 
    1:
                {
                    
    cout<<"    Tong hai so la:";
                    
    l=tong(l1,l2,ssc);
                    
    l->xuat();
                }
                break;
            case 
    2:
                {
                    
    cout<<"    Hieu hai so la:";
                    
    l=hieu(l1,l2,ssc);
                    
    l->xuat();
                }
                break;
            case 
    3:
                {
                    
    cout<<"    Tich hai so la:";
                    
    l=tich(l1,l2,ssc);
                    
    l->xuat();
                }
                break;
            case 
    4:
                {
                    if(
    ss==1)
                        
    cout<<"    So thu nhat > so thu hai";
                    if(
    ss==-1)
                        
    cout<<"    So thu nhat < so thu hai";
                    if(
    ss==0)
                        
    cout<<"    So thu nhat = so thu hai";
                    
    cout<<endl;
                }    
                break;
            }
        }
        
    getch();


  8. #8
    Ngày gia nhập
    05 2007
    Nơi ở
    Thềm Xưa
    Bài viết
    44

    Mặc dù em rất ngu C++, nhưng dù sao cũng cám ơn anh soda rất nhiều,nó sẽ giúp em hiểu rõ hơn về CTDL trong C++.
    Hi vọng 1 ngày nào đó đạt tới trình độ như anh soda
    Hãy cùng nhau xây dựng một cộng đồng lớn mạnh

  9. #9
    Ngày gia nhập
    01 2007
    Nơi ở
    Somewhere I belong
    Bài viết
    168

    Trích dẫn Nguyên bản được gửi bởi yuno Xem bài viết
    Mặc dù em rất ngu C++, nhưng dù sao cũng cám ơn anh soda rất nhiều,nó sẽ giúp em hiểu rõ hơn về CTDL trong C++.
    Hi vọng 1 ngày nào đó đạt tới trình độ như anh soda
    Ôi anh Shoda . Anh Shoda là đẹp trai nhất 4rum đấy em ạ
    In code we trust

  10. #10
    Ngày gia nhập
    04 2007
    Bài viết
    128

    Trích dẫn Nguyên bản được gửi bởi iamvtn Xem bài viết
    Ôi anh Shoda . Anh Shoda là đẹp trai nhất 4rum đấy em ạ
    -->ăn nói cho cẩn thận, bực rồi, láo! đập cái guốc vào mặt bây giờ

Các đề tài tương tự

  1. Nhập 1 dãy các số nguyên dùng danh sách liên kết trong C????
    Gửi bởi h_trang trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 08-04-2016, 02:04 PM
  2. Bài tập C Tạo danh sách liên kết các số nguyên tố từ danh sách L (dslk đơn)
    Gửi bởi pato24193 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 16-12-2012, 02:47 PM
  3. Bài tập C Dùng danh sách liên kết đơn lưu trữ tập hợp các số nguyên
    Gửi bởi cr9 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 12-04-2012, 11:23 PM
  4. danh sách liên kết đơn của các số nguyên
    Gửi bởi nhatnha trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 29-03-2011, 01:06 PM
  5. Danh sách liên kết đơn các số nguyên!
    Gửi bởi Mr Bin trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 05-07-2009, 09:07 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn