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

时间:2014-12-18 13:22:45

标签: c

我正在尝试将十进制编号转换为二进制。代码工作得很好(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(),因为thsi将转换为32位int,对吧?)。

2-其次我必须找到:

log(222121212213212313133123413131313131311313154515441315413451315641314563154134156313461316413415635154613415645156451434)   

库函数log是否能够找到它?那么解决方案是什么?

3 个答案:

答案 0 :(得分:1)

既然你说过你只需要一些指针而不是实际的答案,那么这就是:

  

我无法理解如何将String转换为大型Int

那是因为你做不到。如果你想将一个巨大的数字转换为数字类型,首先你需要一个可以容纳数字大的类型。该语言不提供超过long long的任何内容,通常为128位(即,如果您可以使用C99,或只是long,通常小于long long)。由于您的导师告诉您不要使用任何外部库,这清楚地表明他/她希望您使用仅在语言中提供的内容以及可能的标准库来编写解决方案。

  

库函数日志是否能够找到此

不,你不能使用stoilog,因为所有这些都需要一些算术类型的参数,而这些内置类型中没有一个能够容纳这么大的数字。因此,您必须完全使用字符串(即静态或动态字符缓冲区)。

我知道您希望使用log来推断二进制输出所需的位数;但是还有另一个选择,就是不知道手头的数字位数,并用一些上限动态分配它们,这样你就不需要再进一步分配它们了。

让我们举个例子。

  1. 分配3 char个缓冲区inout(输入长度​​)和bin(输入长度​​ 4)。
  2. 将输入复制到in
  3. 虽然in不是"0""1",但其他人请转到 12
  4. 对于ch中的每个元素in,请执行其他操作 10
  5. ch转换为整数i
  6. 如果is_odd = 1,则i += 10
  7. quot = i / 2
  8. quot附加到out
  9. is_odd = quot % 2;转到 4
  10. 如果is_odd = 1'1'其他'0'追加到bin
  11. out复制到in,重置out并转到 3
  12. in附加到bin
  13. 反向打印bin
  14. 当整数除以2时,商总是小于或等于被除数的位数。因此,您可以使用与输入相同的大小分配inout,并将其用于所有迭代。对于bin缓冲区,知道每个十进制数字不会超过4位(9取一个半字节,1001)会有所帮助。因此,如果输入是10位数,那么10 * 4 = 40字节将是bin缓冲区所需的上限,而inout缓冲区将需要10个字节。< / p>

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

答案 1 :(得分:0)

我担心C中没有标准类型允许你用20148位存储这么大的值...你可以尝试从控制台读取字符串(不转换为int),然后解析你自己串成“010101 ......”。

方法是这样的:
您应该在每个步骤中将字符串“划分”为2(对于每个除法,您需要将字符串的所有数字除以2,并处理特殊情况,如11/2 =&gt; 5),并且对于每个步骤如果该值不能除以2,那么您可以将“1”作为另一个二进制数字,否则将其设为“0”。这样你就可以逐个收集数字'0','1','0','1'等。最后你需要反转数字的顺序。在C#中实现的类似方法可以在这里找到:Decimal to binary conversion in c #

答案 2 :(得分:0)

关于更新:

通过WolframAlpha研磨它给出了:

  

日志(222121212213212313133123413131313131311313154515441315413451315641314563154134156313461316413415635154613415645156451434)

大致是

  

274.8056791141317511022806994521207149274321589939103691837589 ..

测试:

将它放入exp中:

  

2.2212121221321231313312341313131313131131315451544131541 ..×10 ^ 119

这提出了你需要的精确度的问题。

注意:我假设你的意思是自然对数(基数e)。