簡體   English   中英

Bigint 乘法幫助 C++

[英]Bigint Multiplication Help C++

這里我有一個 bigint 計算器,它使用一個 safearray 類(未顯示)來存儲大數並對它們進行算術運算。 我有加減法,但是當我嘗試乘法時,它編譯並運行,但沒有任何反應。 有人可以幫我解決這個問題嗎? 謝謝

int size = 100;

class bigint
{
    SafeArray<int> *arr;
public:
    char sign;
bigint()                                                   //initializes to zero
    {
        arr = new SafeArray<int>;
        for(int i =0;i < size; i++)
            arr->set(i,0);
    }

void print()                                               //prints numbers without zeroes in front
    {
        bool start_num=false;
        for(int i = 0;i <arr->get_size() ;i++)
        {
            if(arr->get(i)!=0 && start_num==false )
            {start_num=true;
                cout << arr->get(i);}
         else if(start_num==true)
             cout<<arr->get(i);

        }

       cout<<endl;
    }

void assign(const bigint &A)                             //
    {
        for(int i=0;i<arr->get_size();i++)
        {                                                            //Ways to initialize stuff
            arr->set(i,A.arr->get(i));
        }

    }

void assign(int num)                                     //
    {
        for(int i = arr->get_size()- 1; i >= 0; i--)
        {
            arr->set(i,num%10);
            num /=10;
        }


    }

void assign(string num)                                  //
    {
        long len = num.length();
        int j=arr->get_size()-1;
        for(long i=len-1;i>=0;i--)
        {
            arr->set(j,num[i]-48);
            j--;
        }
    }

void add_pos(const bigint &A)                                //add big ints
    {
        int carry=0;
        for(int i=size-1;i>=0;i--)
           {
               int result = arr->get(i)+A.arr->get(i)+carry;
               arr->set(i,result%10);
               carry=result/10;
           }
    }

    void  multiply(bigint &A)
    {
        bigint temp;


        for(int i=0;i<size;i +=1)
        {
            temp.arr->set(i,arr->get(i));
            arr->set(i,0);
        }
        int i1, i2;
        for(i2=0; i2<size; i2++)
        {
            int borrow =0;
            for(i1=0;i1+i2<size;i1++)
            {
                int total=temp.arr->get(i1)*A.arr->get(i2);
                int totalsum=total+arr->get(i1+i2)+borrow;
                arr->set(i1+i2,totalsum%10);
                borrow = totalsum/10;
            }
        }


};
int main()

{


    bigint a, b, c;
    a.assign("2543281");
    b.assign("3434");
    a.mulitply(b);
    a.print();
return 0;
}

兩個size = 100 bigint數字相乘的結果肯定需要100數字,也許200

對於最小的修改,您可以將size作為構造函數參數傳遞給bigint 理想情況下, bigint可以使用向量,以便數字數組可以方便靈活地動態增長。

class bigint {
  std::vector<int8_t> digits_;   // each digit must be in 0-9 range
  ...

這些有點復雜,所以我想出了這個:

InfInt InfInt::operator*(const InfInt& a) const{

InfInt final = 0;
std::string result;
InfInt* temp;


int carry;
int current;

//fast mult algorithm. the same we were taught in elementary.
for(long i=length() - 1;i >= 0; i--){
    carry = 0;
    result = "";
    for (long j=a.length() - 1; j >= 0; j--){
        current = (value[i] - '0') * (a.value[j] - '0') + carry;
        result = (char)(current % 10 + '0') + result;
        carry = current / 10;
    }

    if (carry > 0)
        result = (char)(carry + '0') + result;

    temp = new InfInt(result);
    final += *new InfInt(temp->alignLeft(length() - i - 1));
}

final.setSign(sign ^ a.sign);
return final;
}

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM