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


    这里写自定义目录标题

    题目

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

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

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

    123 456
    a A
    输出样例#:

    579
    4

    极笨代码

    #include
    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<
    			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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    错误原因

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

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

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

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

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

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

      if(tmp>16)
      {
          tmp-=16;
      }
      
      • 1
      • 2
      • 3
      • 4

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

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

    正确代码

    #include
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    说说react中引入css的方式有哪几种?区别?
    乾坤基础教程
    创建QDialog工程
    [oeasy]python0024_ 输出时间_time_模块_module_函数_function
    ServiceStack.Redis的源码分析(连接与连接池)
    面试字节跳动测试岗被吊打,60天苦修这些笔记,侥幸收获offer
    NoSQL之redis缓存雪崩、穿透、击穿概念解决办法
    地下管线探测仪都有哪些功能-----TFN RM8500
    Java基础知识【HashMap和Hashtable区别与红黑树】
    opencv 图像识别 指纹识别 - python 计算机竞赛
  • 原文地址:https://blog.csdn.net/jiangti_ng/article/details/132890106