【问题描述】小明用字母 A 对应数字 1, B 对应 2,以此类推,用 Z 对应 26。对于 27以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27, AB 对应 28, AZ 对应 52, LQ 对应 329。请问 2019 对应的字符串是什么?
思考过程:
woc,刚开始把A-1,B-2,……,Z-26这个映射前移
A-0,B-1,……,Z-25
题目的2019,按照新映射应该是2018
然后用了普通n进制和十进制的转化
stack<int> S;
while(num)
{
S.push(num % 26);
num /= 26;
}
然后我发现,上面的代码在进位的时候是进1。
而题目的要求应该是进0。
没办法,只能想一个进0的思路。
因为映射前移比较麻烦,所以我就不想这么做了。
然后我就在想AA-27,是怎么进位的。
没想出来,气的老子直接暴力枚举
for(int i = 0; i <= 26; i++)
for(int j = 0; j <= 26; j++)
for (int k = 0; k <= 26; k++)
{
if (i * 26 * 26 + j * 26 + k == num)
{
cout << (char)('A' + i - 1) << (char)('A' + j - 1) << (char)('A' + k - 1) << endl;
break;
}
}
之后我又想了想其实不用这么枚举
2019 用三个字母就行
所以
int arr[5];
arr[i] = num / (26*26);
num % (26 * 26);
i++;
arr[i] = num / 26;
num % 26;
i++;
arr[i] = num;
这里给一份其他人的代码,在num == 26时会有错误,我不知道怎么去修改
具体的思路:应该和上面的代码(没有循环的那个)一样的思路
把这个数分解,每一位用相应的 字母表示就行
比如 2019 = 2 * (26 * 26) + 25 * 26 + 17;
int num, i = 0;
while(cin >> num)
{
i = 0;
char res[30];
while (num)
{
res[i++] = num % 26 + 'A' - 1;
num /= 26;
}
for (i = i - 1; i >= 0; i--)
cout << res[i];
cout << endl;
}