题目
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;
}