其实36进制加法和字符串相加 字符串相减原理基本差不多 “1”+“zz”=“100” 基本思想就是将sympol= “0123456789abcdefghijklmnopqrstuvwxyz”;sympol代表映射关系。然后将相加结果根据索引index在sympol寻找相应的值,超过就取余数
#include<iostream> #include<string> using namespace std; /* 36进制由0 - 9,a - z,共36个字符表示,最小为'0' * '0''9'对应十进制的09,'a''z'对应十进制的1035 * 例如:'1b' 换算成10进制等于 1 * 36 ^ 1 + 11 * 36 ^ 0 = 36 + 11 = 47 * 要求按照加法规则计算出任意两个36进制正整数的和 * 如:按照加法规则,计算'1b' + '2x' = '48' * * 要求:不允许把36进制数字整体转为10进制数字,计算出10进制数字的相加结果再转回为36进制 * * @param args * / */ #include <iostream> #include<algorithm> #include<string> using namespace std; class Solution { private: int getIntFromChar(char ch) { int ret = -1; if (ch >= '0' && ch <= '9') { ret = ch - '0'; } else if (ch >= 'a' && ch <= 'z') { ret = (ch - 'a') + 10; } return ret; } public: string addFunWithStr(string param1, string param2) { string ret= ""; int ok = 0;//代表着进位 string symbol = "0123456789abcdefghijklmnopqrstuvwxyz"; int param1Len = param1.size(); int param2Len = param2.size(); int max_size = max(param1Len, param2Len); for (int i= param1Len;i< max_size;i++) { param1 = '0' + param1; } for (int i = param2Len;i < max_size;i++) { param2 = '0' + param2; } for (int i= max_size-1;i>=0;i--) { char c; int index = getIntFromChar(param1[i]) + getIntFromChar(param2[i]) +ok;//这个两个字符相加的值在symbol中的映射。 if (index >25) { c = symbol[index -36]; ok = 1; } else { c = symbol[index]; ok = 0; } ret = c + ret; } if (ok == 1) { ret = "1" + ret; } return ret; } }; int main() { Solution s; string a = "zzzzzzzzzzzzz"; string b = "111111111"; cout << s.addFunWithStr(a,b) << endl; }当然其中还可以更加简单
int getIntFromChar(char ch) { int ret = -1; if (ch >= '0' && ch <= '9') { ret = ch - '0'; } else if (ch >= 'a' && ch <= 'z') { ret = (ch - 'a') + 10; } return ret; }改为
unordered_map<char,int> map; string symbol = "0123456789abcdefghijklmnopqrstuvwxyz"; for(int =0;i<symbol.size();i++) { map[symbol[i]]=i; } int getIntFromChar(char ch) { return map[ch]; }是不是更加简单了 。
字符串的加减其实也差不多。基本就是看进位标识了。 减法的进位标志 ok=-1,或者ok=0;