笔记 | 十六进制不进位加法

这里写自定义目录标题

题目

Time Limit: 1000 ms
Memory Limit: 256 mb
16进制不进位的加法,即和正常加法类似,只是不用去计算进位的数,比正常的加法更简单。

如A + 6 = 0(正常加法是10,但是由于不进位所以只有0)

输入输出格式
输入描述:
多组测试数据输入。
输入两个十六进制数,字母可能大写也可能小写。
输出描述:
输出不进位加法的结果,字母要求统一大写。
输入输出样例
输入样例#:

123 456
a A
输出样例#:

579
4

极笨代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string a,b;
	while(cin>>a>>b)
	{
		int la=a.size();
		int lb=b.size();
		int l=max(la,lb),lm=min(la,lb);
		char t[10005];
		for(int i=0;i<lm;i++)
		{
//			cout<<a[la-i-1]<<' '<<b[lb-i-1]<<'q'<<endl;
			if(b[lb-i-1]>='A'&&b[lb-i-1]<='F')
			{
				b[lb-i-1]=b[lb-i-1]-'A'+'0'+10;
			}
			if(a[la-i-1]>='A'&&a[la-i-1]<='F')
			{
				a[la-i-1]=a[la-i-1]-'A'+'0'+10;
			}
			if(b[lb-i-1]>='a'&&b[lb-i-1]<='f')
			{
				b[lb-i-1]=b[lb-i-1]-'a'+'0'+10;
			}
			if(a[la-i-1]>='a'&&a[la-i-1]<='f')
			{
				a[la-i-1]=a[la-i-1]-'a'+'0'+10;
			}
			int tmp=a[la-i-1]+b[lb-i-1]-'0'-'0';
			if(tmp>=16)
			{
				tmp-=16;
			}
			if(tmp>=10)
			{
				t[l-i-1]=tmp-10+'A';
			}
			else
			{
				t[l-i-1]=tmp+'0';
			}
		}
		if(la>lb)
		{
			for(int i=0;i<l-lm;i++)
			{
				if(a[i]>='a'&&a[i]<='f')
					a[i]=a[i]-'a'+'A';
				cout<<a[i];
			}
		}
		else
		{
			for(int i=0;i<l-lm;i++)
			{
				if(b[i]>='a'&&b[i]<='f')
					b[i]=b[i]-'a'+'A';
				cout<<b[i];
			}
		}
		for(int i=l-lm;i<l;i++)
		{
			cout<<t[i];
		}
		cout<<endl;
	}
	return 0;
}

错误原因

主要是在处理十六进制数的部分。

  1. 字符到数字的转换
    在将十六进制字符转换为数字时,您为大写和小写字母都进行了相同的处理。这导致了错误的数值转换。比如:

    if(b[lb-i-1]>='A'&&b[lb-i-1]<='F')
    {
        b[lb-i-1]=b[lb-i-1]-'A'+'0'+10;
    }
    

    这段代码会修改原字符串的值,而不是简单地获取其十进制值。

  2. 输出顺序:由于您的代码中采用了从后往前处理的方式,所以在输出时可能会出现问题。您处理了长度较短的数字,但在长度较长的数字前加上了长度较短的数字。

  3. 无进位加法:您的代码中:

    if(tmp>16)
    {
        tmp-=16;
    }
    

    这是不正确的,应该使用 if(tmp>=16)。但实际上,由于是无进位加法,可以简单地使用模16操作 tmp = tmp % 16

除了上述问题,代码结构和其他部分看起来没问题。但确实需要一些调整来确保正确性和简洁性。

正确代码

#include<bits/stdc++.h>
using namespace std;

char no_carry_hex_add(char a, char b) {
    int ia, ib, result;
    
    if(a >= '0' && a <= '9') ia = a - '0';
    else if(a >= 'a' && a <= 'f') ia = a - 'a' + 10;
    else if(a >= 'A' && a <= 'F') ia = a - 'A' + 10;

    if(b >= '0' && b <= '9') ib = b - '0';
    else if(b >= 'a' && b <= 'f') ib = b - 'a' + 10;
    else if(b >= 'A' && b <= 'F') ib = b - 'A' + 10;

    result = (ia + ib) % 16;

    if(result < 10) return '0' + result;
    else return 'A' + result - 10;
}

int main() {
    string a, b;
    while(cin >> a >> b) {
        string result = "";
        int lenA = a.size();
        int lenB = b.size();
        int maxLength = max(lenA, lenB);
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());

        for(int i = 0; i < maxLength; i++) {
            char charA = i < lenA ? a[i] : '0';
            char charB = i < lenB ? b[i] : '0';
            result += no_carry_hex_add(charA, charB);
        }

        reverse(result.begin(), result.end());
        cout << result << endl;
    }
    return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值