求一个数学公式

kelvinlee
  • 866

数组

12 是 1x
345 是 2x
6789 是 3x

有什么公式能算出 6 = 3x , 4 = 2x.

类似 js 的数组

var list = [];

list[0], list[1] = 1x;
list[2], list[3], list[4] = 2x;

我需要一个公式能直接获得 4 是 2x.

正常情况可以用 for 循环先把数组填满,但是如果超长了就取不到了, 所以需要一个公式.

感谢大家的回答 非常感谢 帮助很多 我继续研究 出答案告诉大家.

已经采纳 非常感谢 @Tempcc

回复
阅读 1k
6 个回答
var list = [];

list[0], list[1] = '1x';
list[2], list[3], list[4] = '2x';
list[5], list[6], list[7], list[8] = '3x';
list[9], list[10], list[11], list[12], list[13] = '4x';
list[14], list[15], list[16], list[17], list[18], list[19] = '5x';
(2 + (n + 1)) * n / 2 = x + 1
2 为首行元素个数
n + 1 为末行元素个数
n 为行数
x + 1 为【第n行最后一个的下标+1】就是【n行总共元素个数的和】

化简得

$$ \sqrt{2x + 4.25} - 1.5 $$

最后的结论

const calc = x => {
  return Math.ceil(Math.sqrt(2 * x + 4.25) - 1.5)
}

// 我需要一个公式能直接获得 4 是 2x.
calc(4) // 2

从计算机的角度:

target=6 # or 4

n=1
left=n
right=n+1

while True:
    if left<=target<=right:
        break
    n+=1
    left+=n
    right+=n+1
    
result="{}x".format(n)

数学不太好,想不到解析式。就跟判断任一个整数在哪两个素数中间一样,只会查素数表。

我大致理解了这个,大致用下面的语言来描述下问题:

  1. 由有序ID(正整数,1开始逐次递增)对象构成的多个元素属于若干集合(有序),集合序号以UID排序
  2. 其规则是ID=1,ID=2的构成集合1,ID=3,ID=4,ID=5的构成集合2,ID=6,ID=7,ID=8,ID=9的属于集合3,以此类推,每个新集合比前个集合多一个元素,且最小ID号元素紧接前一集合最大ID号元素
  3. 现给出元素ID号,求属于那个集合,即根据ID求对应的UID。

这个感觉可以利用每个UID中首个id来定位
可以很快知道

MINID(UID=1)=1
MINID(UID=2)=3=1+2
MINID(UID=3)=6=3+3=1+2+3
MINID(UID=4)=10=6+4=1+2+3+4
MINID(UID=5)=15=10+5=1+2+3+4+5
....
MINID(UID=X)=1+2+...+X

所以要根据id来求X,其实是有

MINID(X)≤id<MINID(X+1)

这就是所求的公式吧。

$$ MINID(X)=\sum^{}_{1≤n≤X}{n} $$

findUid=function(id){
   var rt=1;
   while(1){
      let s1=rt*(rt+1)/2
      let s2=(rt+1)(rt+2)/2
      if( id>=s1 && id<s2) return rt;
      rt++;
   }
}

推测楼主的需求如下

第一组数据,数据2个,数组下标 1,2
第二组数据,数据3个,数组下标 3,4,5
第三组数据,数据4个,数组下标 6,7,8,9
以此类推

求某一组数据的 第一个数据下标
f(0) => 0 // 1个 - 下标 0
f(1) => 1 // 2个 - 下标 1,2
f(2) => 3 // 3个 - 下标 3,4,5
f(3) => 6 // 4个 - 下标 6,7,8,9

很明显,就是求个数 1+2+...+n 的和
f(x) = (1+x) * x / 2
var obj = {
        '1x': [01, 02],
        '2x': [03, 04, 05],
        '3x': [06, 07, 08, 09],
        '4x': [10, 11, 12, 13, 14],
        '5x': [15, 16, 17, 18, 19, 20],
        '6x': [21, 22, 23, 24, 25, 26, 27],
        '7x': [28, 29, 30, 31, 32, 33, 34, 35],
    };//每层的位置范围 例子
    /* 返回数组中的元素所在的层次
    
    arr 数组
    item 数组中的元素
    x 层次
    t 每层的位置开始数
    t+x 每层的位置结尾数
    i  查找位置
    xc 层次总数*/
   
    function calc(arr, item) {
        var i = arr.indexOf(item) + 1;
        if (!i) return;
        var xc = parseInt(arr.length / 2) - 1;
        var t = 0;
        for (var x = 1; x <= xc; x++) {
            t = t + x;
            if (i >= t && i <= x + t) break;
        }
        return x + 'x';
    }


    var arr = [01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14];
    calc(arr, 9);//"3x"

是这个意思吗?你可以在 js 里跑一下试试

function findX(num) {
  var x = 1;
  var l = 1, r = 2;
  while (!(num >= l && num <= r)) {
    x += 1;
    l = r + 1;
    r = l + x;
  };

  return x + 'x';
}

findX(9);
你知道吗?

宣传栏