任意长度的十进制数转二进制数C语言实现

主要思路:
1.核心思想依然是经典的除2取余法。但是由于C语言中整型数据中能够存放的最大的整数为unsigned long int数据,占4B,能够表示0 ~ 2^32 - 1,约为42亿左右的整数。所以对于那些大整数则无法直接使用除2取余的方法来转换;
2.本程序采用逐位除2进位的方法实现转换;
3.采用该方法理论上(不考虑计算机硬件存储空间)可实现任意大小的十进制数转二进制数。

/*--------------------------------------------------------------------------------
功能:将一个100000位以内的十进制数转换成二进制数。
每次运行可实现多次输入输出,Ctrl + Z结束运行。
运行示例:
12
1100

100
1100100

9999999999999999999999999999999
11111100011011110111110001000000010001011000000100100010100101100100110011111111
11111111111111111111111
----------------------------------------------------------------------------------
Author: Zhang Kaizhou
Date: 2019-3-10 15:29:56
---------------------------------------------------------------------------------*/
#include 
#include 
#include 
#define MAXSIZE 100000

void decimal_to_binary(char * str);

int main(){
    char str[MAXSIZE];
    while(scanf("%s", str) != EOF){ // Ctrl + Z 退出循环
       decimal_to_binary(str);
    }

    return 0;
}

void decimal_to_binary(char * str){ // 十进制转二进制
    int i = 0, c, j = 0, r, k = 0, len = strlen(str);
    int decimal[MAXSIZE], bin[MAXSIZE] = { 0 };
    for(j = 0; j < len; j++){ // 字符串转数字数组
        decimal[j] = str[j] - '0';
    }
    while(i < len){ // 逐位实现十进制转二进制
        c = 0;
        for(j = i; j < len; j++){
            r = (decimal[j] + c * 10) % 2; // 余数
            decimal[j] = (decimal[j] + c * 10) >> 1; // 商
            c = r; // 进位
        }
        bin[k++] = c; // 保存进位
        while(decimal[i] == 0 && i < len){
            i++;
        }
    }
    for(i = k - 1; i >= 0; i--){ // 逆序输出
        printf("%d", bin[i]);
    }
    printf("\n");
    return;
}

你可能感兴趣的:(C语言编程)