如何在C中将非常大的二进制转换为十进制

时间:2017-10-04 08:41:22

标签: c binary decimal

我正在使用netBean来编写代码C,我的赋值是将一个非常大的二进制数转换为十进制数(二进制数可能高达100位),我很困惑,因为我的程序在二进制数约为50时有效-60位数但在输入较大时会在运行时自动崩溃。我使用long long int来存储小数结果,但它似乎不起作用! 这是我的代码:

 long long int decimal = 0;
    int position = 0;
    for(int i = strlen(binaryInput)-1; i>=0; --i){
        if(binaryInput[i]=='1'){
            decimal += (long long int)(pow(2,position));
        }
        ++position;
    }
    printf("\nDecimal number is: %lli ", decimal);

'binaryInput'是我从键盘存储binaryNumber的字符串。

3 个答案:

答案 0 :(得分:2)

这是一个提示:

最简单的解决方案是实际获取长二进制数,并将其分成两半(或四分之一,或其他任何内容。)

跟踪哪一个是二进制数的上限,以及哪一个是二进制数的下限。

计算较低范围的真实值,以及较高范围。之后将它们加在一起。

答案 1 :(得分:0)

long long int的范围为-9,223,372,036,854,775,807至9,223,372,036,854,775,807,如上所述here。 100位无法适应那里。但是,这种类型是签名的,您可以尝试使用未签名的类型,但我认为您的数字没有任何假设为非负数。

您可以尝试使用符合128位签名的int128_t,但这不是标准版(Why isn't there int128_t?)。

考虑使用大小为100的数组,其中每个单元格将存储一个数字。使用此方法,建议您使用Double dabble算法,该算法用于将二进制数转换为二进制编码的十进制(BCD)表示法。

如果你需要一个库,那么GNU Multiple Precision Arithmetic Library可以解决问题。

PS:使用位移代替pow(),因为它将对浮点值进行操作,并会降低代码的性能。

答案 2 :(得分:0)

不确定这是否是最优化的技术。最多可以计算1000位数字。您可以增加数组分配以计算更长的二进制数 我使用字符串进行输入,并使用高中数学技术进行加法运算,并计算2的幂

#include <bits/stdc++.h>
typedef long long int lli;
using namespace std;

int main() {

    char bin_number[1010];
    //variable for big integer operation 
    int int_number[1010], t_int_number[500];
    /*
     * int_number : converted decimal number will be stored here
     * t_int_number : will be used to calculate the power of 2
     */


    int bin_length, t_int_length, int_length, index;
    /*
     * bin_length   : length(bin_number)
     * t_int_length : length(t_int_length)
     * int_length   : length(int_length)
     */

    bool carry;

    while(scanf("%s", bin_number) != EOF) {                     //input binary number
        for (int i = 0; i < 500; i++) {                         //intialize decimal number to 0 and t_int_number to 0
            int_number[i] = 0;
            t_int_number[i] = 0;
        }

        //set t_int_number to 1 
        t_int_number[0] = 1;
        t_int_length = 1;
        //set the int_number to 0
        int_length = 1;
        index = 0;
        //calculate input length
        bin_length = strlen(bin_number);

        for (int i = bin_length - 1; i >= 0; i--) {                  //checks each digit of binary number
            //if the digit in binary representation is 1
            if (bin_number[i] == '1') {   
                //sum (int_number, t_int_number)
                for (int index = 0; index < t_int_length; index++) {
                    int_number[index] +=
                        t_int_number[index];                //sum t_int_number digits
                    if (int_number[index] > 9) {                //if carry
                        int_number[index + 1] ++;
                        int_number[index] -= 10;
                    }
                }
                int_length = index;
                if (int_number[index] != 0) {               //i f length increase for addition 
                    int_length ++;
                }
            }

            //Being ready for next iteration
            //multiplying everytime with 2 and save it to t_int_number
            carry = false;
            for (index = 0; index < t_int_length; index++) {
                t_int_number[index] += t_int_number[index];     //double the number
            }
            for (index = 0; index < t_int_length; index++) {
                if (t_int_number[index] > 9) {
                    t_int_number[index] -= 10;
                    t_int_number[index + 1]++;
                }
            }
            if (t_int_number[index] != 0) {
                t_int_length++;
            }
        }

        //printing the decimal number
        for (int i = int_length - 1; i >=0; i--) {
            printf("%d", int_number[i]);
        }
        printf("\n");
    }

    return 0;
}