2

一开始这似乎是一个简单的问题,但现在我不太确定。

我有一个球员名单,按他们的排名排序。

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

我必须将这个列表显示为一个金字塔,其中每一层可以拥有的玩家数量增加一个。所以,排名第一的玩家在金字塔的顶端,第二和第三在第二层,以此类推……

      1 
    2 , 3
  4 , 5 , 6
7 , 8 , 9 , 10

我想知道是否有可能从排名位置(RP)得到金字塔层数(LN)。例如:

1 RP = 1 LN
3 RP = 2 LN
5 RP = 3 LN
8 RP = 4 LN

试图创建一个公式来获得这个值,但现在很明显我的数学需要加强。所以……我来了。

X RP = Y LN?

4

3 回答 3

3

让我处于L级。

那么之前的 (L-1) 个级别有 L(L-1)/2 个数字。换句话说,由于 x 层有 x 个数,我们知道

x(x-1)/2 < i ≤ x(x-1)/2 + x

或等效地

x^2 - x - 2i < 0

x^2 + x - 2i ≥ 0

上述两个方程的判别式为 D = 1 + 8i。显然,水平 L 必须低于第一个二次方的正根;那是

L < (1+√(1+8i))/2

并且至少是第二个二次方的正根,即

L≥(-1+√(1+8i))/2

所以,我们所要做的就是拿下最后一个的天花板。

在 C 语言中,这个值,作为一个整数,是

(int) ceil((-1.0 + sqrt(1.0 + 8.0 * i)) / 2.0)

好问题!

于 2013-02-23T16:56:46.433 回答
2

LN(RP=x) = ceil((sqrt(1+8x)-1)/2)

于 2013-02-23T15:42:59.403 回答
0

您需要创建两个循环,外循环用于每个级别,内循环用于级别中的位数。

int pyramidCount(int val){
    if (val == 0)
        return 0;
    int count =0; 
    for (int i=1;i <=val;i++){
        for(int j=0;j <i; j++ ){
            count ++;
            if(count == val) return i;
        }
    }
    return 0;
}
于 2013-02-23T16:04:45.790 回答