一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串
By Long Luo
最近面试时遇到一个算法题:
仿照Excel的列编号,给出一个数字,输出该列编号字符串。 例如:A对应1,Z对应26,AA对应27,AZ对应52 ……
这个题目是一个典型的26进制思路去处理,一个整数除26然后但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近半个多小时的编写,完成的代码如下:
C++
C++实现如下所示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using namespace std;
//函数itos:正整数到编号转换
//num:输入的正整数,pcout:输出,Max:输出控件最大长度
void itos(int num, char *pcout )
{
char *res = new char[255];
int m = 0, n = 0;
while((num >= 1) && (n < 255))
{
m = num % 26;
if (m != 0)
{
res[n] = 'A' + m - 1;
}
else
{
res[n] = 'Z';
num--;
}
num /= 26;
n++;
}
for(m = n; m > 0; m--)
{
pcout[n - m] = res[m - 1];
}
pcout[n] = '\0';
delete[] res;
return;
}
//soti:字符串到数字的转换
int stoi(char *cha)
{
int m = 0, n = 0, i = 0, val = 0, a = 0;
char *pc = cha ;
while(*pc != '\0' )
{
//后移到个位
pc++;
n++;
}
for(i = 1; i <= n; i++)
{
//位循环
pc--;
a = i;
m = 1;
while(a > 1)
{
//位权
m *=26;
a--;
}
m *= (*pc - 'A' +1);
val += m;
}
return val;
}
int main()
{
char out[255] = {0};
printf( "out = %s\n", out);
itos(32, out);
printf( "out = %s\n", out);
getchar();
return true ;
}