hdu2057 A + B Again

来源:互联网 发布:主图BS点指标公式源码 编辑:程序博客网 时间:2024/05/19 00:42

题意:求2个十六进制数加法的和

写了2个版本的代码

一个版本按照大数求解

#include <iostream>#include <map>using namespace std;#define N 200char 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 或者同时为falsebool 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 另一个为falsebool 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;}


原创粉丝点击