进制转换算法(2 )- 复杂正整数进制(Excel行名称列名称)附模板

-------------------------------------------------------

前言:

我们已经了解了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表序列号icon-default.png?t=LA92https://leetcode-cn.com/problems/excel-sheet-column-number/力扣168.表列名称icon-default.png?t=LA92https://leetcode-cn.com/problems/excel-sheet-column-title/submissions/力扣483.最小好进制icon-default.png?t=LA92https://leetcode-cn.com/problems/smallest-good-base/

例题解答:待添加

 

​​​​​​​

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0<Solving)1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值