求两个任意进制(b)数之和的基本思路:
1.从两个数的最低位开始,直至检索完一个较小的数,且每位相加,存至字符串中。
2.较大数的多余部分直接拼接在上述字符串中。
3.需要注意的是:定义一个数组,用来存储此时两个数相加是否大于b。
下面是实现代码(只支持无符号数运算)
#include<iostream>
#include<string>
using namespace std;
//b进制之和
string BNumSum(string a, string b,int numb)
{
int len_a = a.length();
int len_b = b.length();
int len_max = len_a > len_b ? len_a : len_b;
int len_min = len_a < len_b ? len_a : len_b;
int *add = new int[len_max + 1];//进位为1,否则为0
char *resum = new char[len_max + 1];//和之逆序
if (!resum)
{
cout << "内存分配失败!" << endl;
return "0";
}
//进位标志
for (int i = 0; i < len_max + 1; ++i)
add[i] = 0;
//从两个数最低位开始相加,直到较小的数至最高位
int k = 0;
for (int i = len_a - 1, j = len_b - 1; k < len_min; --i, --j, ++k)
{
int tmp = a[i] - '0' + b[j] - '0' + add[k];
//若tmp大于b,则下一位的add[]需要标记为1
if (tmp >= numb)
{
add[k + 1] = 1;
tmp -= numb;
}
resum[k] = (char)(tmp + '0');
}
//其中较大的数赋给逆序和字符串
if (len_a > len_b)
{
for (int i = len_max - len_min - 1; i >= 0; --i)
{
int tmp = a[i] - '0' + add[k];
if (tmp >= numb)
{
add[k + 1] = 1;
tmp -= numb;
}
resum[k] = (char)(tmp + '0');
++k;
}
}
else
{
for (int i = len_max - len_min - 1; i >= 0; --i)
{
int tmp = b[i] - '0' + add[k];
if (tmp >= numb)
{
add[k + 1] = 1;
tmp -= numb;
}
resum[k] = (char)(tmp + '0');
++k;
}
}
if (add[k] == 1)
{
resum[k] = (char)(add[k] + '0');
++k;
}
resum[k] = '\0';
//将resum字符串逆置,逆置之后的字符串为和
char *sum = new char[len_max + 1];
int j = -1;
for (int i = k - 1; i >= 0; --i)
sum[++j] = resum[i];
sum[++j] = '\0';
return sum;
}
//主函数
int main()
{
string a, b;
int numb;//进制
string sum;
while (1)
{
cout << "请输入进制" << endl;
cin >> numb;
cout << "请输入两个数" << endl;
cin >> a >> b;
sum = BNumSum(a, b, numb);
cout <<"sum = " << sum << endl;
}
return 0;
}
注:欢迎大家在评论区指正。