一开始它似乎是一个简单的问题,但现在我不太确定。
我有一份按其排名排序的球员名单。
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?
答案 0 :(得分: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)
好问题!
答案 1 :(得分:2)
LN(RP=x) = ceil((sqrt(1+8x)-1)/2)
答案 2 :(得分: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;
}