这是1个简单的进制相加的问题,其要求如下:
求解思路如下:
- 由于A与B的值为 2 31 − 1 2^{31}-1 231−1,因此其相加最大值为 2 32 2^{32} 232,因此不能使用int进行存储
- 这里使用long long类型进行存储,由于是数值转换,因此可以使用计算机课程学过的进制相除法
该方法使用方式如下,比如有1个10进制数11,要转换成2进制数,则其操作过程如下:
- 使用11除以2,商为5,余1
- 使用商5除以2,商为2,余1
- 使用2除以2,商为1,余0
- 使用1除以2,商为0,余1
由于商为0,无法再进行除法,因此进制转换结束,因此10进制数11的2进制数为1101。
而2个整型数相加,其最大长度为32+32=64位,因此初始化1个64位的整型数组。而计算机中值存储是从低位往高位,因此在输出时需要从高位开始输出。
对应的C代码如下:
#include <stdio.h>
int main(){
int arr[64] = {0};
long long a,b,total;
long m;
while(scanf("%ld",&m)!=EOF){
if(m==0){
break;
}
scanf("%lld%lld",&a,&b);
total = a + b;
int i=0;
//如果值为0,将跳出循环。如果初始值为0,那么数组将越界访问,即j此时的值为-1
if(total>0){
while(total!=0){
arr[i] = total % m;
total /= m;
i++;
}
//从高位开始输出
for(int j=i-1;j>=0;j--){
printf("%d",arr[j]);
}
}else{
printf("0");
}
printf("\n");
}
return 0;
}
最终测试结果: