Длинная арифметика. C++.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by SeoBee, 26 Mar 2012.

  1. SeoBee

    SeoBee New Member

    Joined:
    9 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте. Помогите пожалуйста с программой на С++, задание - перегрузить операторы +=, *=, = для длинных чисел. Сделал все кроме *= немогу написать норм. алгоритм.

    main.cpp
    PHP:
    #include "Hugeint.h"

    int main()
    {
        
    long numb1numb2numb3;
        
    cout << "Please enter number 20 < diggits. ok? " << endl;
        
    cout  << "Enter first number ( Huge INT ): ";
        
    cin >> numb1;

        
        
    cout  << "Enter second number ( Huge INT ): ";
        
    cin >> numb2;


        
    cout  << "Enter one number ( INT ): ";
        
    cin >> numb3;
        
    cout << endl;

        
    HugeInt n1numb1 );
       
    HugeInt n2numb2 );
       
    HugeInt n5;
       
       
    cout << "First (HugeInt) is: " << n1 << "\nSecond (HugeInt) is: " << n2
           
    << "\nEmpty (HugeInt) is: " << n5 << "\nOne (Int) is: " << numb3 << "\n" << endl;

       
       
    n5 n1 n2;
       
    cout << "(HugeInt) + (HugeInt):  " << endl;
       
    cout << n1 << " + " << n2 << " = " << n5 << "\n\n";

       
    n5 n1 numb3;
       
    cout << "(HugeInt) + (INT):  " << endl;
       
    cout << n1 << " + " << numb3 << " = " << n5 << "\n\n";

       
    cout << "(HugeInt) += (HugeInt):  " << endl;
       
    cout << n1 << " += " << n2 << " = ";
       
    n1 += n2;   
       
    cout << n1 << "\n";

       
    cout << "(HugeInt) *= (HugeInt):  " << endl;
       
    cout << n1 << " *= " << n2 << " = ";
       
    n1 *= n2;   
       
    cout << n1 << "\n";

       
    cout << endl;
       return 
    0;
    HugeInt.h
    PHP:
    #include <iostream>
    using namespace std;

    class 
    HugeInt
    {
       
    friend ostream &operator<<( ostream &, const HugeInt & );

    public:
       
    HugeIntlong ); 
       
    HugeInt( const char * );

       
    HugeInt operator+( const HugeInt & ) const;
       
    HugeInt operator+( int ) const;
       
    HugeInt operator+=( HugeInt & );
       
    HugeInt operator=( HugeInt & );
       
    HugeInt operator*=( HugeInt & );

    private:
       
    short integer90 ];
    };

    HugeInt.cpp
    PHP:
    #include "Hugeint.h"

    HugeInt::HugeIntlong value )
    {
       for ( 
    int i 0<= 29i++ )
          
    integer] = 0;   

       
       for ( 
    int j 29value != && >= 0j-- )
       {
          
    integer] = value 10;
          
    value /= 10;
       }
    }



    HugeInt HugeInt::operator+( const HugeInt &op2 ) const
    {
       
    HugeInt temp;
       
    int carry 0;

       for ( 
    int i 29>= 0i-- )
       {
          
    temp.integer] = integer] + op2.integer] + carry;

          
          if ( 
    temp.integer] > )
          {
             
    temp.integer] %= 10;
             
    carry 1;
          } 
    // end if
          
    else 
             
    carry 0;
       }
       return 
    temp
    }

    HugeInt HugeInt::operator+( int op2 ) const

       return *
    this HugeIntop2 ); 
    }

    HugeInt HugeInt::operator+=( HugeInt op2)
    {
       
    HugeInt temp
       
    int carry 0;

       for ( 
    int i 29>= 0i-- )
       {
          
    integer] = integer] + op2.integer] + carry;

          if ( 
    integer] > )
          {
             
    integer] %= 10
             
    carry 1;
          } 
    // end if
          
    else 
             
    carry 0;
       }
       return *
    this;
    }

    HugeInt HugeInt::operator=( HugeInt op2)
    {
    if ( 
    this == &op2)
    ;
    else
       for ( 
    int i 29>= 0i-- )
       {
          
    integer] = op2.integer];
       }
    return *
    this;
    }
    HugeInt HugeInt::operator*=( HugeInt op2)
    {
            
    int carryij0;
            
    HugeInt temp;

            for (
    29>= 0; --i
            {
        
    int p=0;
                for (
    29>= 0; --j
                {
                    
    xinteger]* op2.integer] + temp.integeri+];
                    
    temp.integeri+]=x%10;
                    
    p=x/10;
                }
        
    temp.integer[i+j+1]=p;
            }
        
        return 
    temp;
    }

    ostreamoperator<<( ostream &output, const HugeInt &num )
    {
       
    int i;
       for ( 
    0; ( num.integer] == ) && ( <= 29 ); i++ )
          ; 
       if ( 
    == 30 )
          
    output << 0;
       else
          for ( ; 
    <= 29i++ )
             
    output << num.integer];
       return 
    output;
    }
    В чем ошибка в операторе *= ?
     
  2. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Оператор *= является вырожденной формой +=.
    Нарушение инкапсуляции рождает ошибки.
     
  3. SeoBee

    SeoBee New Member

    Joined:
    9 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Ошибка в подсчете, что-то с аглгоритмом умножения.