通过任何操作,三个自然数可以存储在少于3个变量中吗?
假设我们在0-150范围内有三个数字,例如:255,12,67。数字彼此无关。
现在存储它们我们需要三个变量或数组,但是可以通过任何数学运算将这些数字存储在2个变量中吗?
答案 0 :(得分:10)
你可以,但这取决于三个数字的范围......
如果您知道存储的是2字节的无符号类型,那么您将有16位 这种模式
aaaabbbbbccccc0
您可以存储3个5位数。您可以通过移动或分割来检索值:使用上面的模式,它将是
a = n / (2^11)
b = (n % 2^11) / 2^6
c = (n % 2^6) / 2
,其中
答案 1 :(得分:5)
您可以将三个自然数字a
,b
,c
存储为
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位(因为值只是0
到5
)。保存和/或检索时,您可以添加/减去250
。
作为另一个例子,他的其他值(12
)可能只是说2
的第二次乘法(即6*2
)。你可能也限制了那里的范围(例如6-120
) - 进一步减少了所需的位数!