java - 解包指数因子表将打包值乘回到原始值

标签 java pow exponentiation exponent

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

最终值是一个从指数 13⁵(5 次方)开始的标识符。

其中存储了是什么样的获胜手牌。 然后用剩下的5个13的幂来存储这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 是从哪里生成的,可能是我编造的一些废话。

我该如何以正确的方式做到这一点?我认为我不能使用移位,因为这不是按位的。

那么就这样完成了吗?

(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]);
    }
}

关于java - 解包指数因子表将打包值乘回到原始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22119353/

相关文章:

ruby - Ruby 中的大乘法输出为负

java - 学习java但是遇到问题

java - Spring HATEOAS 1.x 上的 ResourceSupport.getId()

Java 和 GraphicsMagick——它会起作用吗?

php - 计算浮点幂 (PHP/BCMath)

c# - Math.Pow 的最佳实践

c - GMP 中的基数 16 到基数 2^64 转换

java - 如何在jpa/hibernate中实现这个简单的关联

不能在幂函数中使用常数