Вы уверены, что действительно хотите это сделать? Умножение decimal
примерно в 40 раз медленнее, чем double
, поэтому я ожидаю, что десятичное число Math.Pow()
будет практически неприменимо.
Однако, если вы ожидаете только целочисленные полномочия, я предлагаю вам использовать алгоритм вычислений на основе целочисленных значений, который уже обсуждался здесь в SO.
int position = 'g' - 'a' + 1;
В языке C значения char
преобразуются в значения int
и принимают свои значения ASCII. В этом случае 'a'
совпадает с 97, а 'g'
равно 103. Поскольку алфавит является непрерывным в наборе символов ASCII, вычитая 'a'
от вашего значения дает его относительное положение. Добавьте 1, если вы считаете 'a'
первой (а не нулевой) позицией.
Это будет работать с EBCDIC без учета регистра:
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int getpos (char c)
{
int pos;
const char * alphabet = "abcdefghijklmnopqrstuvwxyz";
const char * found;
c = tolower ((unsigned char)c);
found = strchr (alphabet, c);
pos = found - alphabet;
if (!found)
pos = 0;
else if (pos == 26)
pos = 0;
else
pos++;
return pos;
}
int main ()
{
char tests[] = {'A', '%', 'a', 'z', 'M', 0};
char * c;
for (c = tests; *c; c++) {
printf ("%d\n", *c - 'a' + 1);
printf ("%d\n", getpos (*c));
}
return 0;
}
См. http://codepad.org/ 5u5uO5ZR , если вы хотите его запустить.
Вам также, вероятно, следует учитывать верхний / нижний регистр. По моему опыту, считать от 1 часто опасно, потому что это может привести к единичным ошибкам. Как правило, я всегда конвертирую в индекс, отсчитывающий от единицы, только при взаимодействии с пользователем, и использую внутренний подсчет на основе 0, чтобы избежать путаницы.
int GetPosition(char c)
{
if (c >= 'a' && c <= 'z') {
return c - 'a';
}
else if (c >= 'A' && c <= 'Z') {
return c - 'A';
}
else {
// Indicate that it isn't a letter.
return -1;
}
}