附上代码
#include<stdio.h>
#include<string.h>
char temp1[2002];
char temp2[2002];
char a[2002];
char b[2002];
char c[2002];
int max(int x,int y){
return (x > y) ? x : y;
}
int main()
{
int n;//进制
scanf("%d",&n);
getchar();
scanf("%s",temp1);//将题上所给的数字变成字符串储存进数组
scanf("%s",temp2);
int len1 = strlen(temp1);
int len2 = strlen(temp2);
for(int i = 0;i < len1;i++)// 将temp1中的数组倒序存入数组a中
{
if(temp1[len1 - i - 1] <= '9'&&temp1[len1 - i - 1] >= '0')//数字在10以内,直接存入
a[i] = temp1[len1 - i - 1] - '0';
else//如果存储的是字母,将其变为对应的数字
a[i] = temp1[len1 - i - 1] - 'A' + 10;
}
for(int i = 0;i < len2;i++)//与数组a的操作相同
{
if(temp2[len2 - i - 1] <= '9'&&temp2[len2 - i - 1] >= '0')
b[i] = temp2[len2 - i - 1] - '0';
else
b[i] = temp2[len2 - i - 1] - 'A' + 10;
}
int lenc = max(len1,len2);//c数组的长度取a,b中较大的
for(int i = 0;i < lenc;i++)
{
c[i] += a[i] + b[i];
if(c[i] >= n)//需要进位
{
c[i + 1] += c[i] / n;//进位操作
c[i] = c[i] % n;
if(c[lenc])//如果数组c的最高位不为0,要将数组c的长度加一
lenc++;
}
}
for(int i = lenc - 1;i >= 0;i--)//如果c[i]是十以内数字,直接输出,如果大于十,就将其转化成相应字母输出
{
if(c[i] <= 9&&c[i] >= 0)
printf("%d",c[i]);
else
printf("%c",c[i] - 10 + 'A');
}
return 0;
}
删除线格式
这道题是一道高精度算法的变式,添加了不同进制,使问题变得稍微复杂·,首先因为a和b的位数不一定相等,所以我们选择将a,b倒着写,使他们从个位开始一一对应,在输入的时候,注意数字和字母的变化。
因为9和A在ascall码不是不是连续的,所以要特殊操作。
在计算时,对应位置的数字相加,判断是否需要进位,需要进位的话,分别进行相除和取余操作,再对数组c的长度进行更新。这些都是正常的高精度算法操作。
输出时还需要判断数字是否在10以内,如果不在,需要将其转化为字母再输出。
然后就可以获得AC代码了。
删除线格式
溜了溜了~~