【问题标题】: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 拥有有限范围的值.....

标签: c++ binary decimal long-integer


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 2014-03-13
    • 2020-04-25
    • 2021-12-30
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多