CSP2021模拟赛:T2-Excel计数法

【题目描述】
在 Excel 中,用A表示第1列,B表示第2列,……,Z表示第26列,AA表示第27列,AB表示第28列,……,AZ表示第52列,以此类推。
请写出一个函数,输入用字母表示的列号编码,输出它是第几列。

【输入格式】
一个仅包含大写字母的字符串。

【输出格式】
一行。表示该列在 Excel 中的列号。

【输入输出样例】
输入样例
AB
输出样例
28

【算法分析】
这道题本质上就是十进制和26进制之间的转化。
由于题目中用A表示第1列,B表示第2列,……,Z表示第26列,则可用下面式子表示A~Z。即:
A=1×26^0=1,B=2×26^0=2,C=3×26^0=3,……,Z=26×26^0=26
依据上面思路,易得:
AA=1×26^1+1×26^0=27,AB=1×26^1+2×26^0=28,……,AZ=1×26^1+26×26^0=52
BA=2×26^1+1×26^0=53,BB=2×26^1+2×26^0=54,……,BZ=2×26^1+26×26^0=78
………………
AAA=1×26^2+1×26^1+1×26^0=703,……,AAZ=1×26^2+1×26^1+26×26^0=728
ABA=1×26^2+2×26^1+1×26^0=729,……,ABZ=1×26^2+2×26^1+26×26^0=754
………………
其他字符组合的值,按上述规则进行计算。
显然,通过观察,可以得到计算式子如下。例如:
由A=1×26^0=1,AB=1×26^1+2×26^0=28,可得AB=26×(1×26^0)+2×26^0=26×A+B
由AB=1×26^1+2×26^0,ABZ=1×26^2+2×26^1+26×26^0,可得ABZ=26×(1×26^1+2×26^0)+26×26^0=26×AB+Z
即等效于下面代码中的语句:ans=26*ans+t+1;

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int maxn=200;
int str2int() {
    char ch[maxn];
    scanf("%s",ch);

    int len=strlen(ch);

    int ans=0;
    for(int i=0; i<len; i++) {
        int t=ch[i]-'A';
        if(t<0 || t>=26) {
            printf("invalid input\n");
            return -1;
        }
        ans=26*ans+t+1;
    }

    return ans;
}

int main() {
    while(1) {
        int ans=str2int();
        printf("%d\n",ans);
    }

    return 0;
}



/*
in:
AB

out:
28
*/



【参考文献】
https://blog.csdn.net/qq_45281807/article/details/106043936
https://blog.csdn.net/yueqyueqyue/article/details/119857795
http://oj.code-fans.cn/blogof/chunzhen/blog/544
https://blog.csdn.net/hannea/article/details/25111051
https://blog.csdn.net/weixin_41318405/article/details/79681717

 

猜你喜欢

转载自blog.csdn.net/hnjzsyjyj/article/details/120911470