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

Math 如何在少于三个变量中存储三个小数字,math,Math,通过任何操作,三个自然数可以存储在少于3个变量中吗 假设我们有三个数字,每个数字的范围在0-150之间,例如:255、12、67。数字之间没有关联 现在为了存储它们,我们需要三个变量或一个数组,但通过任何数学运算,这些数字可以存储在两个变量中吗?可以,但这取决于三个数字的范围 如果您知道存储的是2字节的无符号类型,那么将有16位,所以 有这样的图案 aaaabbbbbccccc0 您将能够存储3个5位数字。您可以通过移位或除法检索值:使用上面的模式 a = n / (2^11) b = (n

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

假设我们有三个数字,每个数字的范围在0-150之间,例如:255、12、67。数字之间没有关联


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

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

如果您知道存储的是2字节的无符号类型,那么将有16位,所以 有这样的图案

aaaabbbbbccccc0
您将能够存储3个5位数字。您可以通过移位或除法检索值:使用上面的模式

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

n是变量 %用于剪切最左边的位 除法用于剪切最右边的位。它必须是整数 当然是除法
您可以将三个自然数a、b、c存储为

要检索原始数字,可以对x进行素因式分解,发现a是2的指数,b是3的指数,c是5的指数


这样,通过使用更多的素数,可以在一个自然数中存储无限多个自然数。为了确保不丢失信息,您可能希望对任意大的数字使用BigInt类。

显然,您可以在一个适当类类型的变量中存储三个数字。如果您的意图是将三个数字以尽可能少的位存储在最大值中,那么在C++和C中至少有一个位字段语法:

但是,任何类型的大小都必须可以被字节大小整除,因此,如果没有极端的技巧,就无法将这些示例数放在少于3个字节的范围内。编译器将把结构填充到至少最近的字节,或者如果它优化了速度,可能会进行更严格的对齐


如果您的语言不支持位字段,您将不得不手动计算,就像在其他答案中一样。

除了其他人提出的问题外,我还将介绍另一个方面。 它取决于每个数字要存储的值的范围。如果,对于第一个值,范围仅为250-255,那么您只需要3位,因为值仅为0到5。在保存和/或检索时,您可以添加/减去250


作为另一个例子,其他值12可能只是表示2的第二次乘法,即6*2。例如,您可能已经将范围限制在6-120,进一步减少了所需的位

如果你可以在数字上绑定位数,那么你当然可以根据你需要的位数将其存储在一个变量中……如果你不能绑定位数,那么即使是无限多的变量也不足以存储一个数字。对于当前的实际值,使用正确的编码代码,您可以将所有内容存储在1位中。但它会因其他价值观而失败,所以这不是你想要的。SOoe通用压缩算法可能会使您的大小减少33%,但并非每次输入都会如此。只需使用一个更大的变量、一个字节数组等。@merlin2011我随身携带着数字的范围,假设它们在0到150之间,但数字之间没有关联,这是可以做到的。是的,基尔南的答案是一个解决方案。而且效率极低。2^a部分称为一元编码,这已经够糟糕了。其他部分更糟糕。这个解决方案怎么不使用3个变量?@ifLoop我在为问题背后的问题提供解决方案,而不是问题本身。我怀疑这是一个错误,因为没有人需要在少于3个变量中存储3个数字。我明白你的意思,但我认为这应该是一个注释,而不是一个答案。@iLoop在再次阅读问题后,OP不会问如何使用少于3个变量存储数字,他们会问如何在少于3个变量中存储数字。我认为数字存储在s变量中,位字段标识符a、b和c可用于引用数字。在标准中,位字段不再被称为变量。此外,即使我们把位字段看作变量,我的答案也不会比ZiggStar使用内部变量使用BigIt的建议更为错误或偏离主题。我不同意这个答案,所以应该机械地按照问题的每一个字逐字逐句回答。“三个数字的有效存储”这一标题表明,OP和任何来到这里寻找信息的人可能也对实际问题的实际解决方案感兴趣,而不仅仅是理论问题的表面正确答案。
x = 2^a * 3^b * 5^c
struct S {
    unsigned int a : 8;
    unsigned int b : 4;
    unsigned int c : 7;
};
S s {255,12,67};