Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Số nguyên lớn

  1. #1
    Ngày gia nhập
    11 2008
    Bài viết
    0

    Mặc định Số nguyên lớn

    Mình đã đọc bài này: http://forums.congdongcviet.com/showthread.php?t=9665
    Thấy vẫn lỗi khi mình nhập thử các kí tự sai vào thì sau đó sẽ phải nhập liên tục mãi.Mình nghĩ chuyển kt=0 trước vòng lặp này
    Code:
    BigInt::BigInt()
    {
        int do_dai;    // kt=0 so nhap vao la dung
        char s[50];
        do
        {
            printf("\n Nhap so nguyen lon : ");
            gets(s);
            CompactString(s);
            RevertString(s);
            do_dai=strlen(s);kt=0;
    
            for( int i=0;i<do_dai;i++)       // kiem tra dieu dien so nhap vao
            if(s[i]<'0'||s[i]>'9')
                if(s[0]!='-')
                    kt=1;               // ha co neu vi pham dieu dien
        }
        while(kt==1);
    +) Mình chưa nghĩ ra cách sửa lại số 00011 lại thành 11 cho đúng.
    Mong mọi người gợi ý cho mình với
    Đã được chỉnh sửa lần cuối bởi Skydreamer : 02-12-2008 lúc 11:49 PM. Lý do: Nhầm

  2. #2
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    http://www.4shared.com/file/74208638...4__BT_tin.html
    thao khảo bài làm của mình đi

    PHP Code:
    #include "iostream"
    #include "string.h"
    #include "conio.h"
    using namespace std;
    class 
    BigINT
    {
    private:
        
    char value[200];
        
    int size;
        
    int sign;    // = 0 -> so duong, =-1 -> so am
    public:
        
    BigINT(char giatri[200])
        {
            
    strcpy(this->value,giatri);
            
    this->sign =0//khoi tao cho bat ky so nao la duong
            
    this->size strlen(giatri);//do dai thay doi theo gia tri
        
    }
        
    void Imput();
        
    void Display();
        
    int BigINT::operator>=(BigINT B); //day la ham so sanh 2 so BigINT so sanh ca 2 so duong ,2 so am
        
    BigINT operator +(BigINT B);
        
    BigINT operator -(BigINT B);
        
    BigINT operator * (BigINT B);  //phep nhan

    };
    BigINT BigINT::operator+(BigINT B)//ham tinh tong co 2 nhanh,tong cung dau va tong trai dau
    {
        
    BigINT C("0");
        
    int nho =0;
        
    int max,min;
        
    int j;
        if (
    this->sign == && B.sign == 0)//neu la 2 so cung dau duong 
        
    {
            if (
    B>= (*this)==1||B>=(*this)==)   //goi ham so sanh 2 BigINT ma ta da dinh nghia neu so B > so A hoac B==A thi tinh tong A+B 
            
    {
                
    max strlen(B.value);
                
    min strlen(this->value);
                
    j=max-1;
                for(
    int i=max-1;i>=max min ;i--)
                {
                    
    C.value[j] = (B.value[i] -'0' this->value[min -max] - '0' nho) %10;
                    
    nho = (B.value[i] - '0' this->value[min -max] - '0' nho) /10;
                    
    C.value[j] = (C.value[j] + '0' );
                    
    j--;
                }
                for (
    i=max -min -;i>=0;i--)//chay khi 2 so khong co so cac so bang nhau
                
    {
                    
    C.value[j] = (B.value[i] - '0' nho) %10;
                    
    nho = (B.value[i] -'0' nho) /10;
                    
    C.value[j] = (C.value[j] + '0' );
                    
    j--;
                }
                if (
    nho == 1)//neu van con nho sau khi ket thuc,gia su nhu 99+2 thi phai tang len 1 so thanh so co 3 chu so
                
    {
                    
    char temp[101];
                    
    temp[0]= '1';
                    for(
    int i1;i<=max;i++)
                    {
                        
    temp[i] = C.value[i-1];
                    }
                    
    temp[max+1]='\0';
                    
    strcpy(C.value,temp);
                    
    C.sign B.sign;          //neu la tong 2 so cung dau,ket qua lay dau cua bat ky so  nao trong 2 so
                    
    return C;
                }
                
    C.sign B.sign;
                
    C.value[max] ='\0';
                return 
    C;
            }
            else  
    //nguoc lai neu so A > so B  thi tinh tong B+ A (goi lai ham nay BigINT BigINT::operator+(BigINT &B) )
            
    {
                return 
    + (*this);//( khi nay la A+B  ma)
            
    }
        }
        else if(
    this->sign == -&& B.sign == -1)    //neu 2 so la 2 so am A<0 va B<0 
        
    {
            
    BigINT D("0"),E("0");
            
    DB;
            
    = (*this);
            
    D.sign 0;
            
    E.sign 0;
            
    E;
            
    C.sign = -1;
            return 
    C;
        }
        else  
    //neu 2 so A va B la khac dau thi ta goi lai ham tinh hieu 2 so 
        
    {
            if (
    this->sign == -&& B.sign ==0)  //neu A<0 va B>0
            
    {
                
    BigINT D("0"),E("0");
                
    B;
                
    = (*this);
                
    D.sign 0;  //lay dau gia tri tuyet doi nen sign =0
                
    E.sign 0;
                return 
    E;
            }
            else if (
    this->sign == && B.sign ==-1)
            {
                
    BigINT D("0"),E("0"); //neu 2 so trai dau va A>0 va B<0
                
    B;
                
    = (*this);
                
    D.sign 0;   //lay dau gia tri tuyet doi nen sign =0
                
    E.sign 0;
                
    D  ;  //neu A>0 va B<0
                
    C.sign 0;
                return 
    C;
            }
        }
    }
    void BigINT::Display()
    {
        if (
    this->sign ==0)
        {
            
    cout<<"  "<<value;
            
    getch();
        }
        else
        {
            
    cout<<" -"<<value;
            
    getch();
        }
    }
    int BigINT::operator>=(BigINT B)
    {
        if (
    this->sign == 0&& B.sign ==0)//neu A la so duong va B la so duong (A>0 va B>0)
        
    {
            if (
    strlen(this->value)>strlen(B.value))   //chieu dai so nao lon hon thi lon hon
            
    {
                return 
    1;
            }
            else if (
    strlen(this->value)==strlen(B.value))//neu chieu dai bang nhau 
            
    {
                for (
    int i=0;istrlen(this->value);i++ )//tu hang cao nhat tro di,so nao lon hon thi so do lon hon
                
    {
                    if (
    this->value[i]<B.value[i])
                    {
                        return -
    1;   //B<A
                    
    }
                    else if (
    this->value[i]>B.value[i]) 
                    {
                        return 
    1;
                    }
                }
                return 
    0;  // neu tat ca cac so deu = nhau thi 2 so bang nhau
            
    }
            else
             return -
    1;  //cuoi cung chieu dai B< chieu dai A thi B<A
        
    }
        else if (
    this->sign == 0&& B.sign == -)  //neu A >0 va B<0
        
    {
            return 
    1;   //A>B
        
    }
        else if (
    this->sign == -1&& B.sign == )  //neu A <0 va B>0
        
    {
            return -
    1;//A<B
        
    }
        else
    //neu ca A va B la 2 so AM
        
    {
            if (
    strlen(this->value)>strlen(B.value))   
            {
                return -
    1;
            }
            else if (
    strlen(this->value)==strlen(B.value))//neu chieu dai bang nhau 
            
    {
                for (
    int i=0;istrlen(this->value);i++ )
                {
                    if (
    this->value[i]<B.value[i])
                    {
                        return 
    1;   //B<A
                    
    }
                    else if (
    this->value[i]>B.value[i]) 
                    {
                        return -
    1;
                    }
                }
                return 
    0;  // neu tat ca cac so deu = nhau thi 2 so bang nhau
            
    }
            else
             return 
    1;  
        }
    }
    BigINT BigINT::operator-(BigINT B)
    {
        
    BigINT C("0");
        
    int max,min,nho =0;
        if (
    this->sign==&& B.sign == )  //neu 2 so la cung dau duong
        
    {
            if (*
    this>=B==1||((*this>=B)==0))  //neu A>B  hoac  A == B
            
    {
                
    max strlen (this->value);   //A>= B nen Max = A 
                
    min strlen(B.value);//        Min =B
                
    for (int i=max-1;i>=max-min;i--)
                {
                    if (
    this->value[i] - nho >=B.value[i+min -max])  //phep tinh hieu nhu thong thuong
                    
    {
                        
    C.value[i] = ( this->value[i] -'0' ) - (B.value[i+min -max] - '0') - nho;
                        
    C.value[i] = C.value[i] + '0';
                        
    nho =0;    // A[i]>B[i] nen nho =0
                    
    }
                    else
                    {
                        
    C.value[i] = 10 + (this->value[i] -'0') - (B.value[i+min -max] - '0') - nho;
                        
    C.value[i] = C.value[i] + '0';
                        
    nho =1;
                    }
                }
                if (
    nho ==0)
                {
                    for (
    max -min -1;i>=0;i--)
                    {
                        
    C.value[i] = this->value[i];
                    }
                    
    C.value[max] ='\0';
                    
    C.sign 0;
                    return 
    C;
                }
                for (
    i=max-min-1;i>=0;i--)
                {
                    if (
    nho ==0)
                    {
                        
    C.value[i] = this->value[i];
                    }
                    if (
    this->value[i] - nho -'0' >= 0)
                    {
                        
    C.value[i] = ( this->value[i] -'0' ) - nho;
                        
    C.value[i] = C.value[i] + '0';
                        
    nho =0;
                    }
                    else if (
    this->value[i] - nho -'0' 0)
                    {
                        
    C.value[i] = 10 + (this->value[i] -'0') - nho;
                        
    C.value[i] = C.value[i] + '0';
                        
    nho =1;
                    }
                }
                if (
    nho ==1)
                {
                    
    C.value[0] = '0';
                }
                
    C.value[max] = '\0';
                
    C.sign 0;
                return 
    C;
            }
            else   
    //neu A<B 
            
    {
                
    C- (*this);  //goi lai ham tru de tinh
                
    C.sign = -1;  // vi so A<B nen A-B <0
                
    return C;
            }
        }
        else if ((
    this->sign ==-1&& B.sign ==-1))    //neu 2 so cung dau am A<0  va B<0  thi A-B = |B| - |A|
        
    {
            
    BigINT E("0"),D("0");
            
    B;
            
    = (*this);
            
    D.sign 0;
            
    E.sign 0;
            return 
    -D;
        }
        else
    //neu 2 so trai dau nhau
        
    {
            if (
    this->sign == && B.sign ==-1)  //neu so A >0 va so B<0 -> A-B = |A|+ |B|
            
    {
                
    BigINT D("0");
                
    B// thao tac tren D de ko anh huong den B -> can than vi co the thay doi so lieu cua B
                
    D.sign =0;// lay gia tri tuyet doi cua so B
                
    = (*this)+D;
                
    C.sign 0;
                return 
    C;
            }
            else if(
    this->sign == -&& B.sign ==0)                      //neu so A <0 va so B>0 -> A-B = -(|A|+ |B|)g 
            
    {
                
    BigINT D("0");
                
    = (*this); // thao tac tren D de ko anh huong den B -> can than vi co the thay doi so lieu cua B
                
    D.sign =0;   // lay gia tri tuyet doi cua so A
                
    B+D;
                
    C.sign = -1;
                return 
    C;
            }
        }

    void BigINT::Imput()//...........................ham nhap lam nhiem vu lay gia tri tuyet doi cua 1 so
    {
        
    int j=0;
        
    bool flag;
        do
        {
            
    flag =true;
            
    j++; //..............................j la bien dem,neu 1 so nhap >=2 lan co nghia la no nhap sai
            
    if (j>1)//...........................tu lan thu 2,so dang nhap la so nhap sai
            
    {
                
    cout<<"\n              IMPUT ERROR ! NOW IMPUT AGAIN: \n";//thong bao loi khi nhap sai
            
    }
            
    cout<<"IMPUT BigINT: ";
            
    cin>>value;
            
    size =strlen(value);
            if (
    this->value[0] == '-')//neu la so am thi phai lay gia tri tuyet doi cua so do
            
    {
                for (
    int i=1;i<size;i++)
                {
                    if (
    value[i]<'0'||value[i]>'9')
                    {
                        
    flag false;
                        break;
                    }
                }
                
    //neu nhap dung thi luu no la so am,tuc la =-1
                
    this->sign =-1;
                for (
    i=0;i<size;i++)
                {
                    
    this->value[i]= this->value[i+1];//luu gia tri tuyet doi cua so do
                
    }
            }
            else if (
    this->value[0]>='0'&&this->value[0]<='9')//neu la so duong thi kiem tra x[0] co tu 0 -> 9 khong???
            
    {
                
    this->sign 0;  //so duong -> ghi la 0 va gia tri = gia tri cua no
                
    for (int i=1;i<size;i++)
                {
                    if (
    value[i]<'0'||value[i]>'9')//neu co gia tri >'9' hoac <'0' thi bat nhap lai
                    
    {
                        
    flag false;//cho = sai de nhap lai
                        
    break;//thoat khoi vong lap gan nhat ( la vong lap for day ne )
                    
    }
                }
                
    size strlen(this->value);   //lay kich thuoc cua bien duong
            
    }
        } while (
    flag == false);//neu nhap sai thi phai nhap lai

        //.....................sau khi nhap dung,gio phai truyen gia tri la sign,size,value cho class BigINT 
        //.....................voi so la so duong thi .....tan can xet neu 0000001 -> =1 
        
    while (this->value[0] == '0')
        {
            for(
    int i=0;i<=strlen(this->value);i++)
            {
                
    this->value[i]= this->value[i+1];
            }
        }
        if (
    this->value[0]>='0'&&this->value[0]<='9')//neu la so duong binh thuong thi luu binh thuong len BigINT
        
    {
            
    size strlen(this->value);
        }
        if (
    this->value[0]==NULL)//sau khi xoa neu la NULL -> =0
        
    {
            
    this->value[0] = '0';
            
    size =1;
        }
        
    ////////////////////////////////////neu la so am thi xoa tat ca cac so 0 dung sau dau -
        
    if (this->value[0]=='-')     //VD nhu -0000001 <->  -1
        
    {
            while (
    this->value[1] == '0')
            {
                for(
    int i=1;i<=strlen(this->value);i++)
                {
                    
    this->value[i]= this->value[i+1];
                }
            }
            
    sign =-1;   //la so Am thi sign =-1
            
    if (this->value[1]==NULL)  //sau khi xoa cac so 0 neu la -NULL thi this.value[0] = '0' tuc so do bang 0
            
    {
                
    this->value[0] ='0';
                
    size =1;
                
    sign =0;   // so 0 la so duong
            
    }
        }
    }

    BigINT BigINT::operator *(BigINT B)  //ham nhan 2 so
    {
        
    int maxmin,nho =0;
        
    BigINT C("0"),D("0");
        if ((
    this->sign ==&& B.sign ==)|| ( this->sign ==-&& B.sign ==-1))//neu A va B la 2 so duong hoac 2 so am
        
    {
            if (
    strlen(this->value) >= strlen(B.value))  //neu so A co nhieu chu so hon so B ( A>B >0)
            
    {
                
    max strlen(this->value);
                
    min strlen(B.value);
                for(
    int i=min -1i>=0;i--)  //lay so nho nhan voi so lon,tuc so nho dat duoi,so lon dat tren
                
    {
                    
    nho =0;
                    for(
    int jmax -1;j>=0;j--)
                    {
                        
    C.value[j] = ((B.value[i]- '0') * (this->value[j]- '0') + nho) % 10;//chi lay phan thap phan cua phep nhan 2 chu so
                        
    nho = ((B.value[i]- '0') * (this->value[j]- '0') + nho) / 10;      //lay du
                        
    C.value[j] = C.value[j] + '0';
                    }
                    if (
    nho 0)//tuc la co du sau phep nhan VD nhu 9 * 2  thi co them 1 chu9 so
                    
    {
                        
    char Temp[200];
                        
    strcpy(Temp,C.value);
                        
    C.value[0] = nho '0';   // dua them nho vao dang truoc
                        
    for (int j=1;j<=max;j++)
                        {
                            
    C.value[j] = Temp[j-1];
                        }
                        if (
    i!=min -1)
                        {
                            for (
    int j=max+1;j<max min i;j++)//them so 0 vao sau cac so
                            
    {
                                
    C.value[j] = '0';
                            }
                            
    C.value[max min i] = NULL;
                        }
                        else
                        {
                           
    C.value[max+1] = NULL;
                        }
                        
    C.sign 0;
                    }
                    else   
    //neu ko co du,thi so chu so van duoc giu nguyen
                    
    {
                        
    C.sign =0;  // A>B>0 -> A*B >0 -> la so duong
                        
    if (i<min -1)
                        {
                            for (
    int j=max;j<max min -i;j++)//them so 0 vao sau cac so
                            
    {
                                
    C.value[j] = '0';
                            }
                        }
                        
    C.value[max min -i] = NULL;
                        
    C.sign 0;
                    }
                    
    D.sign =0;
                    
    C+D;
                }    
                return 
    D;
            }
            else
            {
                return 
    B* (*this);
            }
        }
        else
        {
            
    BigINT E("0");
            
    = (*this);  //lay bien ra,minh rat ghet cu (*this) nam trong (*this)
            
    E.sign 0;  //dua ve gia tri tuyet doi
            
    B.sign 0;
            
    B;   //tinh tich 2 so duong quay lai buoc truoc
            
    D.sign = -1;//ah 2 so trai dau voi nhau thi tich am
            
    return D;
        }
    }
    int main()
    {
        
    BigINT A("0"),B("0"),E("0");
        
    cout<<"                  THE PROGRAM OF BIGINT FOR DOS..........\n                        WRITEN BY vCoder_89\n\n";
        
        
    A.Imput();
        
    B.Imput();
        
    cout<<"\n\n PRESS ENTER.....\n";
        
    cout<<"A + B = ";
        
    A.Display(); cout<<" + ";
        
    B.Display();cout<<" = ";
        (
    A+B).Display();
        
    cout<<"\n\nA - B = ";
        
    A.Display(); cout<<" - ";
        
    B.Display();cout<<" = ";
        (
    A-B).Display();
        
    cout<<"\n\nA x B = ";
        
    A.Display(); cout<<"x ";
        
    B.Display();cout<<" = ";
        (
    A*B).Display();
        return 
    0;


    chạy trên VC++
    Đã được chỉnh sửa lần cuối bởi AlexF : 03-12-2008 lúc 09:40 AM.

  3. #3
    Ngày gia nhập
    11 2008
    Bài viết
    0

    tròi sao dài và xa sam thế này ban. có thể nói ngán gọn thuật toán mình bít dc chú

  4. #4
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    bài mình có kết hợp cả số nguyên âm nên hơi dài,thực ra cũng bình thừong thôi,ah mà bài mình thiếu phép chia,đang code nốt
    còn về thuật toán cậu không hiểu thì hỏi chứ mình nói dài lắm,mà mình có comment rồi mà

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

  1. Bài tập C giải thuật nhập vào số nguyên n in ra n số nguyên tố đầu tiên?
    Gửi bởi LTC trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 48
    Bài viết cuối: 25-04-2013, 07:40 PM
  2. Viết chương trình nhập số nguyên dương n, liệt kê n số nguyên tố đầu tiên.
    Gửi bởi maiit trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 19-06-2011, 01:05 PM
  3. Game Viết chương trình nhập số nguyên dương n, liệt kê n số nguyên tố đầu tiên trên C#?
    Gửi bởi maiit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 18
    Bài viết cuối: 08-06-2011, 11:12 PM
  4. Bài tập C++ chương trình đổi 1 số nguyên trong hệ thập phân sang hệ fibo và cộng 2 số nguyên được
    Gửi bởi nghiapro512 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: 23-01-2011, 02:14 PM
  5. Lập trình C xin code cài đặt thuật toán sàng nguyên tố để liệt kê các số nguyên tố 2->480000
    Gửi bởi ngocdung_088 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 23
    Bài viết cuối: 06-12-2010, 11:53 PM

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