我想将输入的整数转换为电子表格column_id,即 1至A,2至B,26至Z,27至AA等。 我的代码正在为所有输入正确运行,除了26的倍数,我无法形成它的逻辑。它可能的逻辑是什么?
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a,n;
string b;
cin>>a;
b="";
while(a){
b+=((a%26)+'A'-1);
a/=26;
}
reverse(b.begin(),b.end());
cout<<b<<"\n";
return 0;
}
输入 -
26
输出 -
A@
预期产出 -
Z
答案 0 :(得分:4)
首先:为什么会出现这种错误?
如果您选择输入26作为a
的值,则计算b
的值如下:
b += ((26 % 26) + 'A' - 1); // or
b += (0 + 'A' - 1); // or
b += 'A' - 1; // which is equal to the '@' symbol
所以显然你不要从它自己的字母中减去。但是如果在使用模运算符之前减少a
会发生什么?
a--;
while (a) {
b+=static_cast<char>('A' + (a % 26));
a/=26;
}
这对于1-26的值现在可以正常工作,但对于26以上的值不起作用,如果为a
输入1,则不会进入循环。切换到do-while循环将修复后者,但仍然存在问题。对于每个大于26的数字,您将得到一个前面有27个单元格的字符串(所以BA
而不是AA
)。但是通过将a--
移动到循环中,这也将被修复:
do {
a--;
b+=static_cast<char>('A' + (a % 26)); // static_cast not needed just for clarity
a/=26;
} while(a);
Here是一个有效的例子。