簡體   English   中英

如何乘以 std::vector<int> 通過 int 向量的每個元素應該是一位數?</int>

[英]How to multiply std::vector<int> by int where vector's each element should be one digit?

我有一個 class,稱之為“BigNumber”,它有一個向量 v 場。
每個元素應該是一個數字。
我想實現一種方法將此向量乘以 integer,但還要保持元素一位數。
例如:<7,6> * 50 = <3,8,0,0>
向量表示一個數字,以這種方式存儲。
在我的示例中,<7,6> 等於 76,<3,8,0,0> 等於 3800。
我嘗試了以下方法,但這並不好(但它有效),而不是問題的實際解決方案。

   //int num, BigNumber bn
    if (num > 0)
  {
    int value = 0, curr = 1;
    for (int i = bn.getBigNumber().size() - 1; i >= 0; i--)
    {
      value += bn.getBigNumber().at(i) * num * curr;
      curr *= 10;
    }
    bn.setBigNumber(value); //this shouldn't be here
    return bn;
  }

預期的算法是將向量本身相乘,而不是與我轉換為此 BigNumber 的變量相乘。

我將 Integer 設置為 BigNumber 的方式:

void BigNumber::setBigNumber(int num)
{
  if (num > 0)
  {
    bigNum.clear();
    while (num != 0)
    {
      bigNum.push_back(num % 10);
      num = (num - (num % 10)) / 10;
    }
    std::reverse(bigNum.begin(), bigNum.end());
  }
  else
  {
    throw TOOSMALL;
  }
};

我要實現的方法:

//class BigNumber{private: vector<int> bigNum; ... }
void BigNumber::multiplyBigNumber(BigNumber bn, int num)
{
  if (num > 0)
  {
    //bn.bigNum * num
  }
  else
  {
    throw TOOSMALL;
  }
}

由於這是一個學校項目,我不想只為你編寫代碼。 所以這里有一個提示。

假設您給我數字 1234 --- 我選擇將每個數字存儲在一個向量中 reverse 所以現在我有了 bignum = [4, 3, 2, 1]。

現在你要我把它乘以 5。所以我創建了一個新的空向量 result=[ ]。 我看一下 bignum 中的第一項。 是4。

4 * 5 是 20,或者(就像你在學校做的那樣)它是 0 進位 2。所以我將 0 推入結果,給出結果 = [0] 和進位 = 2。

給你的問題:

  1. 如果你是手工(在紙上)做這個,你接下來會做什么?
  2. 為什么我決定以相反的順序存儲數字?
  3. 為什么我決定使用新的向量(結果),而不是修改 bignum?

並且只有在您弄清楚如何將 bignum 乘以 int 之后:

  1. 你如何將兩個大數相乘?

該問題的解決方案是以下代碼。 我不知道我是否可以讓這個算法更快,但它確實有效,所以我很滿意。

BigNumber BigNumber::multiplyBigNumber(BigNumber bn, int num){
    if (num > 0)
  {
    std::vector<int> result;
    std::vector<int> rev = bn.getBigNumber();
    std::reverse(rev.begin(),rev.end());
    int carry = 0;
    for(int i = 0; i<rev.size(); i++){
        result.push_back((rev[i] * num + carry) % 10);
        carry = (rev[i] * num + carry) / 10;
        if(i == rev.size()-1 && carry / 10 == 0 && carry % 10 != 0 ) {
                result.push_back(carry);
                carry = carry / 10;
        }
    }
    while((carry / 10) != 0){
        result.push_back(carry % 10);
        carry /= 10;
        if(carry / 10 == 0) result.push_back(carry);
    }
    std::reverse(result.begin(),result.end());
    bn.setBigNumber(result);
    return bn;
  }else{
    throw TOOSMALL;
  }
}

暫無
暫無

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

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