大数进制转换
发布时间:2021-01-10 08:12:21 所属栏目:大数据 来源:网络整理
导读:一般的数字进制转换大家都很熟悉,先转换为十进制数字,再进行 除 n 取余,这种情况适用于操作数不大的情况(不大于最大的基本数据类型(long long)),但是如果操作数上百位以上甚至上千上万该怎么办呢,显然,传统的方法肯定不行, 我们可以举个例子:将
一般的数字进制转换大家都很熟悉,先转换为十进制数字,再进行 除 n 取余,这种情况适用于操作数不大的情况(不大于最大的基本数据类型(long long)),但是如果操作数上百位以上甚至上千上万该怎么办呢,显然,传统的方法肯定不行, 我们可以举个例子:将十进制数字 12 转换为 2 进制数字 第一轮运算中 1 / 2 = 0...1 随后用 1 * 10 + 2 = 12 除以 2 得到 6...0 第二轮运算中 6 / 2 = 3...0 第三轮运算中 3 / 2 = 1...1 第四轮运算中 1 / 2 = 0...1? 所以 十进制数 12 转换为 二进制为 1100 通过这个例子,我们可以看出:如果除数比被除数小,则向后退一位,如果仍然比被除数小,继续退。。。,如果到了结尾,则结束运算,得出结果,如果除数不比被除数小,则 用处数除以被除数,得到商和余数,余数作为结果储存,商用于做下一轮运算。。。直到数字到了末尾,得出结果。 下面是代码: </pre><p><pre name="code" class="cpp">#include <iostream> #include <string> #include <cctype> #include <cstring> using namespace std; const int old_binary = 10; const int new_binary = 16; int result[1000]; int Trans(string str) // 进制转换,返回为结果数组的长度 { int num[1000] = {0}; int save_num[1000] = {0}; int len = str.length(); for(int i = 0; i < len; i++) // 转换为数值储存在数组中 { if(isdigit(str[i])) { num[i] = str[i] - '0'; } else if(islower(str[i])) { num[i] = str[i] - 'a' + 10; } else if(isupper(str[i])) { num[i] = str[i] - 'A' + 10; } } int res_len = 0; int i,j; for(int m = len; m > 0;) { int remainder = 0; for(i = 0; i < m; i++) { remainder = remainder * old_binary + num[i]; save_num[i] = remainder / new_binary; remainder %= new_binary; // 取得每一次除的结果的余数 } j = i; // 储存本轮除运算结束后的商的位数,为下轮准备 result[res_len++] = remainder; // 最后一次取得的余数作为本轮的取余结果储存并等待输出 i= 0; while(i < j && 0 == save_num[i]) // 去除商中的前导 0 { i++; } memset(num,sizeof(num)); // 清除本轮的除数 m = 0; for(i; i < j; i++) { num[m++] = save_num[i]; // 将这一轮的商作为下一轮的除数,得到下一轮除数 } memset(save_num,sizeof(save_num)); // 清除这一轮的商,为下一轮做准备 } return res_len; } void Output(int len) // 高位倒序输出结果 { for(int i = len - 1; i >= 0; i--) { cout << (result[i] > 9 ? (char) (result[i] + 55) : (char) (result[i] + '0')); } } int main() { string str; cin >> str; Output(Trans(str)); return 0; } (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |