-------------------------------------------------------
前言:
我们已经了解了2—16进制的转化,而生活中的很多东西需要用到更多复杂的进制,如:
时分秒(六十进制),Excel的列(26进制,字母),现在我们以Excel列的转换为例:
如图:AL表示列,代表1×26^1+12×26^0=38;
-------------------------------------------
图示:
再例如:AA-------------------------------27
FXSHRXW--------------------2147483647
ZY--------------------------------701
C----------------------------------3等等
----------------------------------------------------------------------------------------------------------------------
题目描述
设计一个程序,使其完成Excel行名称与列名称的相互转换。(注:Excel行名称为十进制,列名称为二十六进制的字母表示)。
程序分析:
短除法完成十进制转换为二十六进制:
按权展开完成十六进制到二十六进制的展开:
由于这里二十六进制用字母表示所以需要字符串操作。
模板代码:
1️⃣:十进制转二十六进制(取余法)
string convertToTitle(int columnNumber) {
string res;
while(columnNumber){
int a0=(columnNumber-1)%26+1; //这里先减1,再取余26,使余数的结果由0-25,变成1-26,否则Z为0,不方便表示
res+=a0-1+'A'; //res为字符串,隐式转换,将数字转化为字符
columnNumber=(columnNumber-a0)/26; //减去a0, 进行移位,用来处理最高位为Z的情况,防止进位A
}
reverse(res.begin(),res.end()); //由于我们从低位到高位存数,因此要倒置一下,使高位在前
return res;
}
2️⃣:二十六进制转换二进制(按权展开)
int titleToNumber(string columnTitle) {
int sum=0;
long long mi=1;
int n=columnTitle.size()-1; //总共的位数
for(int i=n;i>=0;i--){ //从高位开始,到最后一位时,所有位均完成加权操作
int k=int(columnTitle[i]-'A'+1);//将位抽离
sum+=k*mi; //将原来的结果sum更新
mi*=26; //乘上进制
}
return sum;
}
实现:
#include<iostream>
#include<string>
using namespace std;
string convertToTitle(int columnNumber) {//模板套用
string res;
while (columnNumber) {
int a0 = (columnNumber - 1) % 26 + 1; //这里先减1,再取余26,使余数的结果由0-25,变成1-26,否则Z为0,不方便表示
res += a0 - 1 + 'A'; //res为字符串,隐式转换,将数字转化为字符
columnNumber = (columnNumber - a0) / 26; //减去a0, 进行移位,用来处理最高位为Z的情况,防止进位A
}
reverse(res.begin(), res.end()); //由于我们从低位到高位存数,因此要倒置一下,使高位在前
return res;
}
int titleToNumber(string columnTitle) {//模板套用
int sum = 0;
long long mi = 1;
int n = columnTitle.size() - 1; //总共的位数
for (int i = n; i >= 0; i--) { //从高位开始,到最后一位时,所有位均完成加权操作
int k = int(columnTitle[i] - 'A' + 1);//将位抽离
sum += k * mi; //将原来的结果sum更新
mi *= 26; //乘上进制
}
return sum;
}
int main()
{
int columnNumber;
string colunmTitle;
cout << "请输入您想转换的行名称:" << endl;
cin >> columnNumber;
cout << "请输入您想转换的列名称:" << endl;
cin >> colunmTitle;
cout << "由行名称-》列名称(十进制转化二十六进制):" << convertToTitle(columnNumber) << endl;
cout << "由列名称-》行名称(二十六进制转化十进制):" << titleToNumber(colunmTitle) << endl;
return 0;
}
运行效果:
例题:
力扣171.Excel表序列号https://leetcode-cn.com/problems/excel-sheet-column-number/力扣168.表列名称https://leetcode-cn.com/problems/excel-sheet-column-title/submissions/力扣483.最小好进制https://leetcode-cn.com/problems/smallest-good-base/
例题解答:待添加