我有一个扑克纸牌游戏,其中可能的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]);
}
}