jhljx讲Excel(I)

时间限制: 1000 ms 内存限制: 65536 kb
总通过人数: 0 总提交人数: 0

Problem Description

整数对于大家来说都很熟悉,比如我们用到的十进制数。 $$1 = 1 \times 10^{0}$$ $$11 = 1 \times 10^{1} + 1 \times 10^{0}$$ $$111 = 1 \times 10^{2} + 1 \times 10^{1} + 1 \times 10^{0}$$

而对于刚刚进入大学的你们,你们以前应该或多或少地接触过Office这款软件,其中Excel是一个和表格相关的软件。里面的行和列都很有特色。其中,列是按照下面的模式来组织的:

  • 1 ----> A
  • 2 ----> B
  • 3 ----> C
    ....
  • 26 ----> Z
  • 27 ----> AA
  • 28 ----> AB
    ....
  • 52 ----> AZ
  • 53 ----> BA
    ....

我们本次的任务就是将右面的部分转换成左边的。而与该题配套的另一道题将会让你将左面的部分转换成右面的部分。
PS:这道题是一道科普题,大家可以先自己思考,如果不会可以看题目下方的详细解析。

Input

由于大家尚未接触数组,所以为了方便大家初学,本题数据只有一行,为好多字符组成的序列,类似AA,AB这样。
输入字符只有A,B,C,...,Z这26个英文大写字母。

Output

输出字符序列对应的数字,保证输出结果在int范围内。

Sample Input

ABCDEFG

Sample Output

334123303

Learning Tag

  • 字符读入
  • 多进制的使用

Tutorial

由于大家没有学习数组,所以本题只有一行数据。因此可以考虑将字符序列按照一个字符一个字符的顺序读入。
这里就涉及到最原始的大坑如何一个字符一个字符读入的知识点,利用该知识点我已经成功坑害了很多届学弟学妹。
初学C++,我们需要按照以下方式来读入变量:

  • 读入整型变量int

    int a;  
    while(cin>>a){ //会读入多个整型变量,直到最后结束
    
    }
  • 读入字符型变量char也是一样

    char c;  
    while(cin>>c){  //会连续读入多个字符,直到最后结束
    
    }

在本题中,我们可以这样:

#include<iostream>
using namespace std;
int main(){
    char c;
    while(cin>>c){
    }
}

这样就可以读入多个char字符了。但是好几届的同学都会疑问,这段代码在自己的codeblocks软件中会一直运行,无法跳出while循环。这里需要注意在codeblocks中按Ctrl+Z就可以跳出循环。

第二个需要注意的是如何将这些字符转换成数字。我们需要注意字符char类型是上机常考的知识点,char字符表面看起来是字符,比如‘a’,'b','c','d'。实际它们也和整型int有一个一一对应的关系。我们可以把char理解为披着字符外衣的int。这个对应关系大家可以取百度ASCII码。

所以字符也可以像int整数一样做加减法运算。通过ASCII码我们知道ABCD...XYZ它们对应的int值是连续的。所以‘B’-'A'=1,'Z'-'A'=25。

而将这些字符转换成对应数字的过程和我们对整数的理解有很相似的地方,注意类比和对照: 对于十进制数字1234,如果我们依次读入这个数字的每一位,那么我们最终如何得到1234这个数字??

最开始读入1,结果为1
读入2,此时数字为12,结果为1*10+2
读入3,此时数字为123,结果为(1*10+2)*10 +3
读入4,此时数字为1234,结果为((1*10+2)*10+3)+4

#include<iostream>
using namespace std;
int main(){
    int ans=0;  
    char c;  
    while(cin>>c){
         ans = ans*10 + c-'0';
    }
    cout<<ans<<endl;
}

这个程序输出的ans的值和我们输入的值相同。上上古学长曾经出过类似求一个123456789101112这样的特别长的数字a对一个b取模的题。其中很长的数字a就必须依靠上面的这个字符读入程序来读入,然后将ans = ans*10 + c-'0';改成类似ans = (ans*10 + c-'0')%mod;即可。

此外,大家可以参考这道题来加深对字符读入的理解。 而本题我们可以把这个看作26进制来使用同样的方法。

#include<iostream>
using namespace std;
int main(){
    int ans=0;  
    char c;  
    while(cin>>c){
         ans = ans*26 + c-'A'+1;
    }
    cout<<ans<<endl;
}

其中,ans = ans*26 + c-'A'+1;这个式子很重要。

相关推荐