我正在咨询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;
和我试图改善它。