题意:求2个十六进制数加法的和
写了2个版本的代码
一个版本按照大数求解
#include <iostream>
#include <map>
using namespace std;
#define N 200
char str1[N];
char str2[N];
int num1[N];
int num2[N];
int num3[N];
int m_hash[256];
void init()
{
m_hash['0'] = 0;
m_hash['1'] = 1;
m_hash['2'] = 2;
m_hash['3'] = 3;
m_hash['4'] = 4;
m_hash['5'] = 5;
m_hash['6'] = 6;
m_hash['7'] = 7;
m_hash['8'] = 8;
m_hash['9'] = 9;
m_hash['A'] = 10;
m_hash['B'] = 11;
m_hash['C'] = 12;
m_hash['D'] = 13;
m_hash['E'] = 14;
m_hash['F'] = 15;
m_hash['a'] = 10;
m_hash['b'] = 11;
m_hash['c'] = 12;
m_hash['d'] = 13;
m_hash['e'] = 14;
m_hash['f'] = 15;
}
//add 方法的flag1与flag2符号必须相同,即符号相同的数相加
//flag1与flag2同时为true 或者同时为false
bool add(int num1[], int & n1, int flag1, int num2[], int n2, int flag2)
{
int i, j, k, tmp, carry;
bool flag = flag1;
memset(num3, 0, sizeof(num3));
if (n1 < n2)
{
memcpy(num3, num1, sizeof(int) * n1);
memcpy(num1, num2, sizeof(int) * n2);
memcpy(num2, num3, sizeof(int) * n1);
tmp = n1;
n1 = n2;
n2 = tmp;
}
i = n1 - 1;
j = n2 - 1;
k = 0;
carry = 0;
while(j >= 0)
{
carry = num1[i] + num2[j] + carry;
num3[k++] = carry % 16;
carry /= 16;
--i;
--j;
}
while(i >= 0)
{
carry = num1[i] + carry;
num3[k++] = carry % 16;
carry /= 16;
--i;
}
while(carry)
{
num3[k++] = carry % 16;
carry /= 16;
}
i = k - 1;
while(i >= 0 && num3[i] == 0) --i;
if (i == -1)
{
++i;
}
for (j = 0; i >= 0; --i)
{
num1[j++] = num3[i];
}
n1 = j;
if (n1 == 1 && num1[0] == 0)
{
flag = true;
}
return flag;
}
//sub 方法的flag1与flag2符号必须相异,即符号不同的数进行相减操作
//flag1与flag2必须一个为true 另一个为false
bool sub(int num1[], int & n1, bool flag1, int num2[], int n2, bool flag2)
{
int i, j, k, carry, tmp;
bool flag = flag1;
if (n1 < n2)
{
memcpy(num3, num1, sizeof(int) * n1);
memcpy(num1, num2, sizeof(int) * n2);
memcpy(num2, num3, sizeof(int) * n1);
tmp = n1;
n1 = n2;
n2 = tmp;
flag = flag2;
}
else if (n1 == n2)
{
i = 0;
while(i < n1 && num1[i] == num2[i]) ++i;
if (i < n1 && num1[i] < num2[i])
{
memcpy(num3, num1, sizeof(int) * n1);
memcpy(num1, num2, sizeof(int) * n2);
memcpy(num2, num3, sizeof(int) * n1);
flag = flag2;
}
}
i = n1 - 1;
j = n2 - 1;
while(j >= 0)
{
carry = num1[i] - num2[j];
if(carry < 0)
{
num1[i - 1]--;
num1[i] = carry + 16;
}
else
{
num1[i] = carry;
}
--i;
--j;
}
while(i >= 0)
{
carry = num1[i];
if (carry < 0)
{
num1[i - 1]--;
num1[i] = carry + 16;
}
else
{
num1[i] = carry;
}
--i;
}
i = 0;
while(i < n1 && num1[i] == 0) ++i;
if (i == n1)
{
--i;
flag = true;
}
for (j = 0; i < n1; ++i)
{
num1[j++] = num1[i];
}
n1 = j;
return flag;
}
int main()
{
int t, i,j, n1, n2, len1, len2;
bool flag1, flag2, flag;
init();
while(scanf("%s %s", str1, str2) != EOF)
{
flag1 = false;
flag2 = false;
if (str1[0] != '-')
{
flag1 = true;;
}
if (str2[0] != '-')
{
flag2 = true;
}
n1 = 0, n2 = 0;
i = 0;
len1 = strlen(str1);
len2 = strlen(str2);
if (str1[i] == '+' || str1[i] == '-')
{
++i;
}
for (;i < len1; ++i)
{
num1[n1++] = m_hash[str1[i]];
}
i = 0;
if (str2[i] == '+' || str2[i] == '-')
{
++i;
}
for (;i < len2; ++i)
{
num2[n2++] = m_hash[str2[i]];
}
if (flag1 == flag2)
{
flag = add(num1, n1, flag1, num2, n2, flag2);
}
else
{
flag = sub(num1, n1, flag1, num2, n2, flag2);
}
if (!flag)
{
printf("-");
}
for (i = 0;i < n1; ++i)
{
printf("%c", num1[i] >= 10 ? (num1[i] - 10+ 'A'):(num1[i] + '0') );
}
printf("\n");
}
return 0;
}
一个简单的版本
#include <iostream>
using namespace std;
int main()
{
__int64 a,b;
while (scanf("%I64X %I64X",&a,&b) > 1)
{
if (a+b<0)
{
printf("-%I64X\n",(-a)+(-b));
}
else
{
printf("%I64X\n",a+b);
}
}
return 0;
}

本文介绍了一种实现两个十六进制数加法的方法,包括一个基于大数处理的复杂版本和一个简单的直接处理版本。复杂版本通过自定义数组和进位处理实现了加法逻辑,而简单版本则利用了现代编程语言的内置支持。
681

被折叠的 条评论
为什么被折叠?



