这里写自定义目录标题
- 题目
- 极笨代码
- 错误原因
- 正确代码
题目
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;
}
错误原因
主要是在处理十六进制数的部分。
-
字符到数字的转换:
在将十六进制字符转换为数字时,您为大写和小写字母都进行了相同的处理。这导致了错误的数值转换。比如:if(b[lb-i-1]>='A'&&b[lb-i-1]<='F') {b[lb-i-1]=b[lb-i-1]-'A'+'0'+10; }
这段代码会修改原字符串的值,而不是简单地获取其十进制值。
-
输出顺序:由于您的代码中采用了从后往前处理的方式,所以在输出时可能会出现问题。您处理了长度较短的数字,但在长度较长的数字前加上了长度较短的数字。
-
无进位加法:您的代码中:
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;
}