10~~
//函数1 转化
void transform(int num,char *binary)//binary二进制
{
int count=0;
while(num>0)
{
binary[count++]=(num%2)+'0';
num/=2;
}
if(count==0)//为了处理输入数字为 0 的特殊情况
binary[count++]='0';
binary[count]='\0';//作用是给字符串添加结束标志,i 最终会指向最后一个字符的下一位
//反转字符串数组binary
int len =strlen(binary);
for(int j=0;j<len/2;j++)
{
char temp=binary[j];
binary[j]=binary[len-j-1];
binary[len-j-1]=temp;
}
}
//函数2 相加
long long addition (char *arrA,char *arrB)
{
int lenth_A=strlen(arrA);
int lenth_B=strlen(arrB);
long long result=0,power=1;//power初始值为1,每处理一位数字后乘以10(power *= 10)
int i=lenth_A-1,j=lenth_B-1;//二进制字符串的最低位在字符串的末尾
while(i>=0||j>=0) //i 和 j 从末尾开始遍历 “从低位到高位”
{
int digitA = (i >= 0)? (arrA[i] - '0') : 0;
int digitB = (j >= 0)? (arrB[j] - '0') : 0;
int sum = digitA + digitB;
result += sum * power;
power *= 10;
i--;
j--;
}
return result;
}
int main()
{
int A,B;
scanf("%d %d",&A,&B);
char arrA[32] = {0};
char arrB[32] = {0};
transform(A,arrA);
transform(B,arrB);
long long result=addition(arrA,arrB);
printf("%lld\n", result);
◮:
int类型范围不足
C 语言中int类型通常为 32 位,最大值约为2147483647(约 20 亿)。而当 A、B 较大时(如 32768),其二进制字符串为1000000000000000(16 位),按十进制规则相加的结果为2000000000000000(2e15),远超过int的最大值,导致整数溢出,结果被截断为错误值
还有一个细节错误导致结果不正确:输出格式符不匹配 %d 改为 %lld:
◮:
①char *binary 声明了一个字符指针,它可以指向一段字符类型的内存空间。
当我们在调用这个函数时,通常会传入一个字符数组(如 char binA[32]),此时数组名会自动转换为指向数组首元素的指针,所以这个指针就指向了我们传入的字符数组的起始位置。
②函数内部需要将转换后的二进制字符串存储起来,通过指针可以操作外部传入的数组内存,从而将结果 “带出去”。如果不使用指针(或数组),函数就无法将转换后的字符串返回给调用者(因为 C 语言函数的返回值只能有一个,且直接返回数组在 C 中是不允许的,简单说,这里的 * 是指针语法,但它指向的是外部传入的字符数组,使得函数能够操作该数组并存储结果。这也是 C 语言中函数处理数组的常用方式。
③ num % 2 得到的是 0 或 1(整数类型),ASCII 表中:字符 '0' 的 ASCII 码是 48(十进制)
字符 '1' 的 ASCII 码是 49(十进制),当 num % 2 == 0 时:0 + '0' 等价于 0 + 48(因为 '0' 的 ASCII 是 48 ),结果是 48,对应字符 '0' 。当 num % 2 == 1 时:1 + '0' 等价于 1 + 48,结果是 49,对应字符 '1'
⑷if (i == 0) 是为了处理输入数字为 0 的特殊情况。具体来说:
变量 i 用于记录二进制字符串的长度(字符个数)。在循环中,每处理一个二进制位,i 就会自增 1。
当输入的 num 是 0 时:
循环条件 while (num > 0) 不会成立(因为 0 不大于 0),循环体一次都不会执行。
因此 i 的值会保持初始值 0(因为循环中没有执行过 i++)。
此时 i == 0 为真,就会执行大括号里的代码:
⑸digitA 表示 字符串数组arrA 中当前索引 i 位置的数字(整数 0 或 1)。
代码中 (i >= 0) ? (arrA[i] - '0') : 0 的意思是:如果 i 还在有效范围内(没遍历完 A),就取 arrA[i] 对应的数字(用 arrA[i] - '0' 把字符 '0'/'1' 转成整数 0/1);否则视为 0(相当于短字符串前面补 0)。
digitB 同理
⑹⑺⑻
浙公网安备 33010602011771号