Предположим, что есть N
(N = 10) букв A, B, ..., J. String S
является экземпляром перестановки.
Я хочу сохранить порядок перестановок 32-разрядным целым числом p
и преобразовать строку String S
в порядок p
, а для проверки целочисленного значения я написалкак то так:
int S2P(char *s) {
unsigned int p = 0;
char c;
while (c = *s++) {
c -= 'A';
p *= 10;
p += c;
}
return p;
}
char *P2S(unsigned int p, char *buf) {
char *s = buf + 10;
char used[20], *t;
int i, j, c;
strcpy(used, "ABCDEFGHIJ");
*s-- = '\0';
for (i = 1; i < 10; i++) {
*s-- = c = 'A' + (p % 10);
p /= 10;
t = strchr(used, c);
if (t)
*t = '-';
}
for (i = 0; i < 10; i++)
if (used[i] != '-')
*s = used[i];
return buf;
}
int PCheck(int p) {
char tmp[20];
int q = S2P(P2S(p, tmp));
return p == q;
}
Работает не так эффективно.Это значит,
- Невозможно добавить еще одну букву.(max (N) = 10)
- В
P2S
используется дополнительная таблица поиска для определения 10-й буквы. PCheck(int)
слишком медленно.
Как сделать лучше?Прямой кусок кода приветствуется.