将十进制转换为二进制的程序不适用于大输出

Posted

技术标签:

【中文标题】将十进制转换为二进制的程序不适用于大输出【英文标题】:program to convert decimal to binary is not working for large outputs 【发布时间】:2021-11-29 08:54:27 【问题描述】:

我编写了一个程序将十进制转换为二进制,但它不适用于大输出。我认为我无法在我的函数中正确使用long long int

这是我的代码:

#include<iostream>
using namespace std;

int decimal_to_binary(int n)

    int x=1;
    long long int ans=0;
    while (x<=n)
        x*=2;
    
    x/=2;
    while(x>0)
    
        int lastdigit=n/x;
        n-=lastdigit*x;
        x/=2;
        ans=ans*10+lastdigit;
    
    return ans;


int main()

    int input;
    long long int a;
    cout<<"input = ";
    cin>>input;
    a=decimal_to_binary(input);
    cout<<a;

例如, 如果我输入 30,它会给我预期的输出,即 11111。

程序给出正确的输出,最多 1023 个输入, 但在那之后它给了我意想不到的价值。例如, 如果我输入 1200 那么输出是 1420175408。

【问题讨论】:

我可以说,当你的函数说它将返回一个int 时,将结果存储在long long 中没有任何意义。 我也很好奇你为什么要返回一个整数类型。它可能看起来像二进制文件,但实际上不是。 但它不适用于大输出 -- 给我们一个你正在使用的输入样本。 您将无法在long long int 变量中存储大数的二进制等价物。您需要使用整数数组或字符串。 十进制到二进制的转换是一个 I/O 函数,而不是你应该将一个整数值映射到另一个整数值(即不是你在做什么)。您正在执行的映射会将1 映射到121031141005 到@98765436@9876、@98765436@5 @ 到 1107111810001610000。请注意,即使是很小的值,输出值也大大大于输入,并且增长得更快(实际上是指数级的)。而且由于long long 拥有有限范围的值..... 【参考方案1】:

您正在存储一个十进制数,它是 n 的二进制表示,重新解释为十进制。

如果 n>2047,ans 将溢出一个std::int32_t;如果 n>524287,ans 将溢出 std::int64_t(最大的有符号 64 位数字是 9223372036854775807;unsigned 将允许在 ans 中多一位)。

正确的返回是一个字符串。试试这个:

std::string decimal_to_binary(int n)

    int x=1;
    std::string ans;
    while (x<=n)
        x*=2;
    
    x/=2;
    while(x>0)
    
        int lastdigit=n/x;
        n-=lastdigit*x;
        x/=2;
        ans=ans+(char)('0'+lastdigit);
    
    return ans;

【讨论】:

以上是关于将十进制转换为二进制的程序不适用于大输出的主要内容,如果未能解决你的问题,请参考以下文章

大整数进制转换

将十进制值转换为二进制、十六进制和八进制的单个函数不会转换为二进制

将二进制转换为十进制/十六进制/八进制(java)[关闭]

如何在 Swift 中将十六进制转换为有符号浮点数?适用于正数但不适用于负数

程序设计:此程序功能将输入的十进制整数num(num<=65535)转换为二进制(双字节,16位)输出。

九度OJ题目1080:进制转换(java)使用BigInteger进行进制转换