欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-08 15:52:41
...

主要思路:
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}