gpt4 book ai didi

javascript - 随机组合的最小最小公共(public)乘数

转载 作者:行者123 更新时间:2023-11-27 22:47:22 29 4
gpt4 key购买 nike

TLDR:我正在寻找一种算法,它可以在知道以下情况的情况下返回可变数字数组的最小可能的最不常见乘数:

  • 其中一个数字
  • 我的数组的大小
  • 数字可能的最小值和最大值

我正在使用音乐应用程序并遇到算法问题:当混合不同的节奏(每个节奏具有不同的步数)时,我需要计算结果循环的步数。这可以通过最不常见的乘数计算轻松完成。假设我有一个长度数组,其中包含步骤中的所有不同长度

var lengths = [4,5,6,8]

//greatest common denominator
function gcd(a,b){
var t,b,a
while(b != 0){
t = b;
b = a%b
a=t
}
return a;
}
//least common multiplier
function lcm(a,b){
return a*b/gcd(a,b)
}
function getLoopLength(arr{
var result = 1;
for(var i = 0;i<arr.length;i++)
result = lcm(result,arr[i])
return m
}


getLoopLength(lengths)
==> 120
// superimposing 4 rhythm with length 4,5,6 and 8 will result in a a rhythms that loops in 120 steps

现在我需要一个函数来计算以下假设的最小步骤数:

  • 可能的步长是有限的(在我的例子中为 2 到 11 之间 - 可能会改变)
  • 所有步长值必须不同
  • 已知 1 个长度值(将是一个变量)
  • 我的长度数组的大小可能会有所不同(在我的例子中为 1 到 4 之间 - 不会改变)

所以我想要的是一个如下所示的函数:

var minPossibleLength(knownLength, lengthsSize){
...
return min
}

例如 minPossibleLength(4,4) 应返回 24(当我的长度为 [2,4,8,3] 或 [2,4,8, 6])

现在我尝试暴力破解它,遍历所有可能的长度组合并找到最小lcm,它确实适合我的条件,但我很想知道是否可以找到更优雅和更有效的解决方案。

谢谢

最佳答案

以下 minPossibleLength(4,4) 算法找到比 24 更好的解决方案:[4, 2, 3, 6] 的最小公倍数为 12..

var lengths = [4,5,6,8]

//greatest common denominator
function gcd(a,b){
var t,b,a
while(b != 0){
t = b;
b = a%b
a=t
}
return a;
}
//least common multiplier
function lcm(a,b){
return a*b/gcd(a,b)
}
function getLoopLength(arr, length){
var result = 1;
for(var i = 0;i<arr.length && i<length;i++)
result = lcm(result,arr[i])
return result
}

var minBound = 2;
var maxBound = 11;

function minPossibleLength(knownLength, lengthsSize) {
var min = 27720; // Maximum for bound range [2..11]
var newmin; // Newly computed minimum.
if (lengthsSize == 1)
return knownLength;
lengths[0] = knownLength;
for(var i = minBound; i<=maxBound; i++) {
if (i != knownLength) {
lengths[1] = i;
for(var j = (lengthsSize>2?i+1:maxBound); j<=maxBound; j++) {
if (lengthsSize<3 || (i != j && j!= knownLength)) {
lengths[2] = j;
for(var k = (lengthsSize>3?j+1:maxBound); k<=maxBound; k++) {
if (lengthsSize<4 || (i != k && j != k && k!= knownLength)) {
lengths[3] = k;
newmin = getLoopLength(lengths, lengthsSize)
if (newmin < min) {
min = newmin;
console.log('Minimum lcm so far for (['+knownLength+', '+i+(lengthsSize>2?', '+j+(lengthsSize>3?', '+k:''):'')+']) = '+min);
}
}
}
}
}
}
}
return min;
}

minPossibleLength(4,4);

关于javascript - 随机组合的最小最小公共(public)乘数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38323525/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com