将大整数压缩为小整数

时间:2014-03-25 13:21:19

标签: java

我正在尝试找到一种将大数字压缩到另一个数字的方法。输入的数字可以包含30到45位数字。数字范围在0到9之间。

压缩结果的最大长度应为24位。此外,结果应该只是一个NUMBER。

例如:

输入:1123456789013956410078121395641007812 - >总共37位数

输出:1245785478547 - >共13位数。 (这只是一个想象的结果。)

注意:输出应包含数字0 - 9,最大长度为24。

感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您似乎正在寻找自定义哈希函数来处理您的输入数字。 您可以使用任意数量的可用整数/字符串散列算法或编写自己的方法。查看输入数据,您的输入似乎是一个数字字符串,而不是整数数据类型。一个例子是

public long getHash(String input)
{
int hash=<any prime number>;
for (int i=0; i < input.length(); i++) {
    hash = hash*<any large prime_number>+charAt(i);
}
}

答案 1 :(得分:0)

更简单的策略是将数字编码为double并将其转换为long

public static long asLong(String s) {
    return Double.doubleToRawLongBits(Double.parseDouble(s));
}

这样做的好处是,您至少可以获得该数字的幅度和前16位数字。 (它使用不超过19位数)

考虑一个更简单的问题,你想将两个数字压缩成一个数字,然后从头开始

0 => 0
1 => 1
....
8 => 8
9 => 9
10 => ?? there is no more symbols you can use.

出于同样的原因,也不可能将25位或更多位数压缩成24位数。


另一个逻辑难题;如果你可以将45位数字压缩成24位数字,你应该能够将24位数字压缩成14位数字,将14位数字压缩成8位数字,将8位数据压缩成4位数字,然后将4位数字压缩成2位数据,然后再将1位数字压缩成4位数。这对你来说听起来有道理吗?

现在你可以这样做,如果你不需要它是可逆的。将数字的所有数字相加,将所有这些数字相加,直到只得到一位数。但是你可以看到,如果你说5结果你不能把它变成一个45位数,总和为5(或总和为5)