将整数转换为电子表格column_id时出错(1到' A',2到' B' ...)

时间:2017-08-31 11:35:13

标签: c++ string

我想将输入的整数转换为电子表格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

1 个答案:

答案 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是一个有效的例子。