题目
给定一个十进制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’为止。
结束

1万+

被折叠的 条评论
为什么被折叠?



