【牛客网】进制转换(2~36)
来源:互联网 发布:无线连接投影仪软件 编辑:程序博客网 时间:2024/06/10 16:06
本代码中M表示原始进制,N表示目标进制,大数处理的C++实现,M和N均[2,36]
#include<iostream>#include<cstdio>#include<cstring>#include<map>using namespace std;const int maxM = 36; // 最大进制数 '0'-'9' + 'a'-'z' 共 36 种const int maxn = 10000;int M = 2; // 原始进制int N = 2; // 目标进制string str; // 存储输入// 所有数组 0 号元素均表示数组长度int dr[maxn]; // 存储由字符串转过来的大数int drans[maxn]; // 求余过程中的商int drres[maxn]; // 余数map<char, int> mci; // 字符与数字对应的mapmap<int, char> mic; // 数字与字符对应的map// 字符与数值对应map初始化void initialization(){ // 字符与数字对应的map构建 for(int i = 0; i < maxM; ++i) { if(i < 10) { // '0' - '9' mci['0'+i] = i; mic[i] = '0'+i; } else { // 'a' - 'z' mci['a'+i-10] = i; mic[i] = 'a'+i-10; } }}// 判断是否是大写字母int isCapital(char ch){ if(ch >= 'A' && ch <= 'Z') { return 1; } else { return 0; }}// 字符串预处理,并给存储原始进制的数组赋值void pretreatment(){ // 将所有大写字母转换成小写 for(int i = 0; i < str.length(); ++i) { // 大写字母转小写 if(isCapital(str[i]) == 1) { str[i] = 'a' + str[i] - 'A'; } } // 给存储原始进制的数组赋值 memset(dr, 0, sizeof(dr)); for(int i = 0; i < str.length(); ++i) { dr[++dr[0]] = mci[str[i]]; }}// 将 M 进制的 dr 转换成 N 进制void solve(){ memset(drres, 0, sizeof(drres)); int i, j, y; // 模 n 取余法,(总体规律是先余为低位,后余为高位) while(dr[0] >= 1) { // 只要被除数仍然 >= 1,则继续操作 y = 0; i = 1; drans[0] = dr[0]; // 商的长度与被除数相同(包含前导0) while(i <= dr[0]) { y = y * M + dr[i]; drans[i++] = y / N; y %= N; } drres[++drres[0]] = y; // 本轮计算得到的余数 i = 1; // 找到下一轮商的起始位置 while((i<=drans[0]) && (drans[i] == 0)) ++i; // 清除这一轮使用的被除数 memset(dr, 0, sizeof(dr)); // 本轮得到的商为下一轮的被除数 for(j = i; j <= drans[0]; ++j) { dr[++dr[0]] = drans[j]; } // 清除本轮的商 memset(drans, 0, sizeof(drans)); }}// 输出 N 进制的结果void output(){ for(int i = drres[0]; i >= 1; --i) { cout << mic[drres[i]]; }}int main(){ initialization(); // 字符与数值对应的map的构建 while(cin >> M >> N) { cin >> str; pretreatment(); // 预处理字符串,并给存储原始进制的数组赋值 solve(); // 将 M 进制的 dr 转换成 N 进制 output(); // 输出 N 进制的结果 cout << endl; } return 0;}
1 0
- 【牛客网】进制转换(2~36)
- 进制转换(进制转换)
- 十进制转换2-9进制转换
- 36进制转换
- 进制转换2
- 进制转换2
- 进制转换2
- 进制转换2
- 进制转换 2
- 进制转换2
- 进制转换2
- 进制转换2
- 进制转换2
- 2-36进制转换 C语言
- Delphi--2~36进制的转换
- 任意进制(2-36)互相转换
- (2-20)进制转换
- 进制转换(10转2)
- c语言版贪吃蛇
- 控件包含代码块(即 <% ... %>),因此无法修改控件集合。
- 用Cognos Maps展现和地域相关的数据
- Android之JSON格式数据解析
- 看JavaScript面向对象编程指南电子书笔记之-alert,prompt,confirm用法总结
- 【牛客网】进制转换(2~36)
- xml signature
- Java程序优化的一些最佳实践
- mysql 异常关闭查看日志
- MBProgressHUD简单使用
- 大于号转义符>---小于号转义符<
- Android Studio之ADB错误解决 java.io.IOException: Error while Installing APK
- 数据库面试中常用的10个问题
- Java JVM:垃圾回收问题