我正在諮詢StackOverflow的天才。我一直堅持使用我正在編寫的算法返回兩個或更多數字的最小公倍數(LCM)。刪除每個元素可以分隔數組中的另一個元素
例如,LCM(3,4,6)= 24,LCM(2,2,2)= 2,LCM(8,9)= 72,等
這是我想要的程序使用(除非你有更好的想法):
(1)陣列複製到一個向量(因爲我們需要它是動態的步驟3)
(2)排序向量(這將使步3更容易)
(3)刪除每個元素被分成另一個元素(例如,如果你想要計算LCM(3,4,6),3是多餘的,因爲LCM(3,4,6)= LCM(4,6))
(4)的陣列中的每個元件的計算機產品
步驟3是其中我無法寫入優雅過程,因爲所有的刪除操作都會改變向量的大小和等等。
int LCM(int* numsPtr, size) {
assert(size > 1);
std::vector<int> numsVec(numsPtr, numsPtr + size); // need to work with copy of the array
for (int k = 0; k < size; ++k)
numsVec[k] = numsPtr[k];
std::sort(numsVec, numsVec + size);
// What now????
}
順便說一句,這是我努力的一部分,在項目歐拉Problem 5
我已經做了蠻力方式
// -------------------- Brute force --------------------
int n = 20;
int k = n;
while (true) {
// divisors to cross off: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
if ( (k % 20 == 0) // 3 6 7 8 9 11 12 13 14 15 16 17 18 19
&& (k % 19 == 0) // 3 6 7 8 9 11 12 13 14 15 16 17 18
&& (k % 18 == 0) // 7 8 11 12 13 14 15 16 17
&& (k % 17 == 0) // 7 8 11 12 13 14 15 16
&& (k % 16 == 0) // 7 11 12 13 14 15
&& (k % 15 == 0) // 7 11 12 13 14
&& (k % 14 == 0) // 11 12 13
&& (k % 13 == 0) // 11 12
&& (k % 12 == 0) // 11
&& (k % 11 == 0) )
break;
++k;
}
std::cout << "The smallest number divisible by 1, 2, ..., " << n << " is " << k << std::endl;
和我試圖改善它。