如何在少于三个变量中存储三个小数字

时间:2014-10-31 07:16:21

标签: math

通过任何操作,三个自然数可以存储在少于3个变量中吗?

假设我们在0-150范围内有三个数字,例如:255,12,67。数字彼此无关。

现在存储它们我们需要三个变量或数组,但是可以通过任何数学运算将这些数字存储在2个变量中吗?

4 个答案:

答案 0 :(得分:10)

你可以,但这取决于三个数字的范围......

如果您知道存储的是2字节的无符号类型,那么您将有16位 这种模式

aaaabbbbbccccc0

您可以存储3个5位数。您可以通过移动或分割来检索值:使用上面的模式,它将是

a = n / (2^11)
b = (n % 2^11) / 2^6
c = (n % 2^6) / 2

,其中

  • n是变量
  • %用于删除最左边的位
  • 除法用于删除最右边的位(它必须是整数 当然是分裂)

答案 1 :(得分:5)

您可以将三个自然数字abc存储为

x = 2^a * 3^b * 5^c

要检索原始数字,您可以对x进行素数分解,并将a作为2的指数,b作为{{1}的指数}和3作为c的指数。

通过这种方式,您可以使用更多素数在一个自然数中存储无限多个自然数。为了确保您不会丢失信息,您可能希望将5类用于任意大数字。

答案 2 :(得分:3)

显然,您可以在一个适当类类型的变量中存储三个数字。如果你打算用尽可能少的位存储具有确切最大值的三个数字,那么至少在c ++和c中,有一个位字段语法:

struct S {
    unsigned int a : 8;
    unsigned int b : 4;
    unsigned int c : 7;
};
S s {255,12,67};

任何类型的大小都必须可以按字节大小整除,因此您不能在不超过3个字节的情况下使这些示例数字适合,而不会出现极端欺骗。如果优化速度,编译器会将结构填充到至少最近的字节或可能更严格的对齐。

如果您的语言不支持位字段,则您必须手动进行数学运算,就像在其他答案中一样。

答案 3 :(得分:0)

除了其他人提出的建议外,我还会提出另一个方面。 它取决于每个数字存储的值的范围。如果,对于第一个值,范围仅为250 - 255,那么您只需要3位(因为值只是05)。保存和/或检索时,您可以添加/减去250

作为另一个例子,他的其他值(12)可能只是说2的第二次乘法(即6*2)。你可能也限制了那里的范围(例如6-120) - 进一步减少了所需的位数!