我有一个扑克纸牌游戏,其中可能的13张纸牌等级存储为[0到12]。
每只手握有5张卡片,其中有13张可能的卡片等级。

最终值是一个从指数13′(至5的幂)开始的标识符。

哪家商店是什么样的获胜手。
然后使用剩余的13的5次幂存储5张卡中的每张。

更不用说并不是所有的5张卡都一直存储,这仅是为了赢得高卡,这需要4次踢球。

我的问题是仅使用最终价值,我将如何拆开每张卡的包装以及它是什么样的获胜手。

/** The ranking factors (powers of 13, the number of ranks). */
private static final int[] RANKING_FACTORS = {371293, 28561, 2197, 169, 13, 1};

rankings[0] = HIGHCARD WIN [0]
rankings[1] = 12; //Ace
rankings[2] = 6; //Eight
rankings[3] = 9; //Jack
rankings[4] = 1; //Three
rankings[5] = 3; //Five

// Calculate value.
for (int i = 0; i < NO_OF_RANKINGS; i++) {
    value += rankings[i] * RANKING_FACTORS[i];
}

(0*371293) + (12*28561) + (6*2197) + (9*169) + (1*13) + (3*1) = 357451


尝试从该357451值中解压缩值。
开始尝试在这里计算数学。

if 357451 < 371293                        rankings[0] = 0

(357451 / 28561) = 12                     rankings[1] = 12
(357451 / 2197) / ((13*2)+1) = 6          rankings[2] = 6
(357451 / 169)  / ((13*18)+1) = 9         rankings[3] = 9
//Alright it seems that 18 is from answers (12+6) probably because I haven't subtracted them or something.
//So next one should be (12+6+9)= 27, but it's 2115
(357451 / 13)  / ((13*2115)+1) = 1        rankings[4] = 1
(357451 / 1) / ((13*9165)+1) = 3          rankings[5] = 3


我想我已经弄清楚了,但我不了解这些值可能也仅在这种情况下有效,否则在任何其他情况下都会中断。

不知道值2, 18, 2115, 9165可能是由我整理的一些废话生成的。

我该如何正确执行此操作?我认为我不能使用shifting,因为这不是按位的。

如此完成吗?

(357451 / 371293)          = 0
(357451 / 28561)           = 12
(357451 % 28561) / 2197    = 6
(357451 % 2197) / 169      = 9

(357451 % 169) / 13        = 1
(357451 % 13)              = 3

最佳答案

您通过这部分是正确的。

(357451 / 28561) = 12                     rankings[1] = 12


但这不好

(357451 / 2197) / ((13*2)+1) = 6          rankings[2] = 6


您需要将结果12乘以28561,然后从357451中减去该结果以查看剩余的结果。在这种情况下为14719。

现在您可以继续使用该数字而不是357451。因此14719/2197 = 6。

继续该模式(14719-(2197 * 6)),直到获得5个数字。

(357451%28561)如果您要这样做,也会获得剩余。

我的“解码”代码...

private static final int[] RANKING_FACTORS = {4826809, 371293, 28561, 2197, 169, 13, 1};

@Test
public void testDecode() {
    long value = 357451;
    int[] rankings = new int[6];
    //System.out.println(Math.max(0,value-RANKING_FACTORS[0]));
    for (int i=0; i < rankings.length; i++) {
        rankings[i] = (int)(value / RANKING_FACTORS[i]);
        value %= RANKING_FACTORS[i];
        System.out.println(rankings[i]);
    }
}

07-26 02:50