b进制运算之一--和

3 篇文章 0 订阅

求两个任意进制(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;
}

注:欢迎大家在评论区指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值