十进制到二进制

题目
给定一个十进制N,计算其二进制等价值。
示例1:

输入:N=7
输出:111

示例2:

输入:N=33
输出:100001

代码:

void toBinary(int N)
{
    int b[32];
    int i=0;
    while(N>0)
    {
        b[i++]=N%2;
        N=N/2;
    }
    for(int j=j-1;j>=0;j--)
    {
        printf("%d",b[j]);
    }
}

AI优化后的代码

// 该函数用于将十进制整数转换为二进制字符串并打印
void toBinary(int N) {
    // 处理 N 为 0 的特殊情况
    if (N == 0) {
        printf("0");
        return;
    }
    // 用于存储二进制位的数组
    char b[33]; // 32 位整数加 1 个终止符
    int i = 31;
    b[32] = '\0'; // 字符串终止符

    // 填充二进制位
    while (N > 0) {
        b[i--] = (N % 2) + '0'; // 转换为字符
        N /= 2;
    }

    // 跳过前导零
    while (i >= 0) {
        b[i--] = '0';
    }

    // 找到第一个非零字符的位置
    int start = 0;
    while (b[start] == '0') {
        start++;
    }

    // 打印从第一个非零字符开始的二进制字符串
    printf("%s", &b[start]);
}

优化的代码解释

char b[33]; // 32 位整数加 1 个终止符
int i = 31;
b[32] = '\0'; // 字符串终止符

定义了一个长度为33的char类型的数组,其中前32位用于存储二进制数,最后一位用于存储字符串的终止符‘/0’,i定义为31从最后一位开始存储二进制数

while (N > 0) {
    b[i--] = (N % 2) + '0'; // 转换为字符
    N /= 2;
}

通过不断的将N对2取余将余数取出加上‘0’转换为字符,最终的结果就是十进制N对应的二进制

while (i >= 0) {
    b[i--] = '0';
}

如果二进制数没有将三十二位全部占满就将前面的位置填充字符‘0’

int start = 0;
while (b[start] == '0') {
    start++;
}

start的目的是找到第一个不是字符0的位置,从这一位开始读取数组中的数据

printf("%s", &b[start]);

将结果使用%s格式说明符打印
知识点
1.为什么要定义char类型的数组,而不是int类型的数组?
输出更便利,用int类型的数组需要用循环来输出数据,用char类型的数组只需要用printf(“%s”,)来输出
2.为什么加字符‘0’就可以将1或0变为字符‘1’或‘0’?
因为字符‘0’的ASCLL码是48,所以加‘0’就相当于加48,再通过ASCLL转换为字符,字符‘1’的ASCLL是49,所以数字1加48就是字符’1’的ASCLL。
3.前导零有什么好处?
可以使所有的二进制数以固定的长度显示,更方便数据的比较
4.为什么输出字符串要加取地址符?
因为字符串是以字符数组的形式存储的,字符数组在大多数表达式中会被隐士转换为指向数组首元素的指针,而且在printf(“%s”,…);中%s格式说明符要求一个char*类型的的参数,就是指向字符串首字符的指针,printf函数会从这个指针指向的位置依次输出字符,直到遇到‘\0’为止。
结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wind_one2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值