[英]Find a value of an element in vector in a std::map < int , std::vector <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。
並且只有在您弄清楚如何將 bignum 乘以 int 之后:
該問題的解決方案是以下代碼。 我不知道我是否可以讓這個算法更快,但它確實有效,所以我很滿意。
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.