繁体   English   中英

C:将非常大的整数转换为二进制

[英]C: Converting a very large integer into a binary

我正在尝试将十进制数转换为二进制。 该代码运行正常(Windows 7、32位MS-VS2010):

int main()
{

    int k, n;  
    int binary[100];
    printf("Enter the value in  decimal \n ");
    scanf("%d", &k);
    n = (log(k * 1.0) / log(2 * 1.0)) + 1  ; //total no. of binary bits in this decimal 

    for (int i = n; i > 0; i--)
        {
        binary[i] = k % 2;
        k /= 2;
        }

 return 0; 

}

但局限性在于它仅适用于Int大小值,即32位。 我想修改此代码,以使其适用于2048位(实际上包含617位数字的十进制数)。 我不允许使用任何图书馆。

有人可以给我一些指导如何解决这个问题吗?

有人可以给一个示例代码片段说64位吗? 然后,我可以使用它扩展到更高的值。

更新

1-根据建议,我正在尝试使用字符串。 但是我不明白如何将String转换为大Int(我不能使用stoi(),因为这将转换为32位int,对吗?)。

2-其次,我必须找到:

log(222121212213212313133123413131313131311313154515441315413451315641314563154134156313461316413415635154613415645156451434)   

库函数log能够找到这个吗? 那该怎么办呢?

因为您告诉您只需要一些指针而不是实际答案,所以这里是:

我不明白如何将字符串转换为大Int

那是因为你做不到。 如果要将大数字转换为数字类型,首先需要一种可以容纳大数字的类型。 该语言没有为您提供多于long long东西(通常是128位长)(即,如果您可以使用C99,或者只是long ,通常比long long )。 由于您的导师告诉您不要使用任何外部库,因此很明显,他/她希望您使用仅在该语言中可用的内容(也许还有在标准库中)提供的解决方案进行编码。

库功能日志是否可以找到此内容

不,您不能使用stoilog因为所有这些都期望某种算术类型的参数,而所有内置类型都没有那么大的参数来容纳如此庞大的数字。 因此,您必须完全使用字符串(即静态或动态char缓冲区)。

我知道您想使用log来推断二进制输出所需的位数; 但是还有另一种选择,那就是不事先知道数字的位数,并以一定的上限动态分配它们,因此您无需进一步重新分配它们。

让我们举个例子。

  1. inout (输入的长度)和bin (输入的长度* 4)中分配3个char缓冲区。
  2. 复制输入到in
  3. in不是"0""1" ,否则转到12
  4. 对于ch中的每个元素in否则转到10
  5. ch转换为整数i
  6. 如果is_odd = 1i += 10
  7. quot = i / 2
  8. 追加quotout
  9. is_odd = quot % 2 ; 转到4
  10. 如果is_odd = 1 is_odd '1'否则添加为'0'bin
  11. 复制outin ,重out和GOTO 3
  12. 附加inbin
  13. 反向打印bin

当您将数字整数除以2时,商将始终小于或等于被除数的位数。 所以,你可以分配in ,并out具有相同大小的输入,并将其用于所有迭代。 对于bin缓冲区,了解每个十进制数字所占用的位数不会超过4位(9占用半字节,即1001)将有所帮助。 因此,如果输入是10位数字,则10 * 4 = 40字节将是bin缓冲区所需的上限,而inout缓冲区将需要10个字节。

这是一个模糊的算法写法,我希望它能传达这个想法。 我觉得编写代码比正确编写算法要容易得多。

恐怕C语言中没有标准类型可以让您使用20148位存储如此大的值...您可以尝试从控制台读取字符串(不转换为int),然后将字符串解析为“ 010101 ....”。

该方法将是这样的:
您应该在每个步骤中将字符串“除以2”(对于每个2的除法,您需要将字符串的所有数字除以2,并处理11/2 => 5之类的特殊情况),并且对于每个步骤,该值不能除以2,那么您可以将“ 1”作为另一个二进制数字,否则应输入“ 0”。 这样,您就可以一一收集数字“ 0”,“ 1”,“ 0”,“ 1”等。 最后,您需要反转数字的顺序。 您可以在C#中实现类似的方法:在C#中将十进制转换为二进制

关于更新:

通过WolframAlpha对其进行研磨可以得到:

日志(222121212213212313133123413131313131311313154515441315413451315641314563154134156313461316413415635154613415645156451434)

大概

274.8056791141317511022806994521207149274321589939103691837589 ..

测试:

将其放入exp可以得到:

2.2212121221321231313312341313131313131131315451544131541 ..×10 ^ 119

这就提出了有关所需精度的问题。

注意:我假设您是指自然对数(以e为底)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM