我正在通過解決Euler項目中的問題來學習自己的C++。其中一個練習是要找到最大的主要因素,這是我找到解決的最快方法是使用分而治之,使用下面的代碼片段:在C++中連接並返回數組
long primeFactor1(long n);
long primeFactor(long n)
{
long divisorR = findDivisor(n);
long divisorL = n/divisorR;
if (divisorR == n){
return divisorR;
}
long primeFactorDivL = primeFactor1(divisorL);
long primeFactorDivR = primeFactor1(divisorR);
return std::max(primeFactorDivL,primeFactorDivR);
}
long primeFactor1(long n)
{
std::cout << "Is "<<n<< " a prime? " << checkPrime(n) << std::endl;
if (checkPrime(n)){
return n;
}
else{
return primeFactor(n);
}
}
哪裏checkPrime是檢查它的一些功能是一個質數,findDivisor找到數n的最小偶數除數。所以這個程序很好地工作,並且即使給出問題中給出的數字(這是相當大的,至少可以說)也立即給出和輸出。
我的問題是,但是,我想轉換程序返回所有的素因子,而不是最大的。這意味着我基本上已經改變:
return std::max(primeFactorDivL,primeFactorDivR);
的東西,符連接兩個替代和調整,使得它們能夠返回所產生的陣列功能。
在Matlab中,我來自我只是把方括號括在s.t.
[primeFactorDivL,primeFactorDivR]
什麼是最好的(最好也是最簡單的)方式來做到這一點在C + +?
UPDATE:
我曾嘗試使用載體,它可以在下面的葉子使用類型轉換的代碼可以看出實現它。但是,試圖編譯它,我得到的編譯錯誤:
primeFactor.cpp:51:9: error: no viable conversion from 'typename
enable_if<__is_forward_iterator<__wrap_iter<long *> >::value && is_constructible<value_type, typename
iterator_traits<__wrap_iter<long *> >::reference>::value, iterator>::type' (aka
'std::__1::__wrap_iter<long *>') to 'std::vector<long>'
...primeFactorDivL.insert(primeFactorDivL.end(), primeFactorDivR.begin(), primeFactorDivR.end());
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/vector:568:5: note: candidate constructor not
viable: no known conversion from 'typename enable_if<__is_forward_iterator<__wrap_iter<long *>
>::value && is_constructible<value_type, typename iterator_traits<__wrap_iter<long *>
>::reference>::value, iterator>::type' (aka 'std::__1::__wrap_iter<long *>') to 'const
std::__1::vector<long, std::__1::allocator<long> > &' for 1st argument
vector(const vector& __x);
^
1 error generated.
在哪裏我的代碼現在是:用C
std::vector<long> primeFactor1(long n);
std::vector<long> primeFactor(long n)
{
long divisorR = findDivisor(n);
long divisorL = n/divisorR;
if (divisorR == n){
return std::vector<long>(divisorR);
}
std::vector<long> primeFactorDivL(primeFactor1(divisorL));
std::vector<long> primeFactorDivR(primeFactor1(divisorR));
return primeFactorDivL.insert(primeFactorDivL.end(), primeFactorDivR.begin(), primeFactorDivR.end());
}
std::vector<long> primeFactor1(long n)
{
std::cout << "Is "<<n<< " a prime? " << checkPrime(n) << std::endl;
if (checkPrime(n)){
return std::vector<long>(n);
}
else{
return primeFactor(n);
}
}
通過'std :: vector'你可以創建一個兩個數字的向量,就像'{a,b}'一樣。我相信這個練習的有趣之處在於(但我沒有分析過,而且對我來說晚了),以避免O(n^2)行爲。我認爲這主要涉及將結果向量作爲參考參數傳遞。另一種可能性是使用鏈表(比如'std :: list '),但我想我會選擇vector參數。或者你可以重新表達你的算法迭代。在這種情況下,推送項目只需使用'std :: vector :: push_back'。 –
你沒有做你的功能狀態。你應該在該函數中返回一個'std :: vector',但是你要返回'insert()'的值。在完成需要完成的任何工作後,您應該簡單地返回'primeFactorDivL;'。 –
PaulMcKenzie
我終於認爲我明白這是如何工作的。謝謝。 –