По идее, из обычного курса информатики известны алгоритмы для перевода из десятичной СС в произвольную и из произвольной в десятичную. Надеюсь, что по заданию нет необходимости переводить отрицательные и дробные числа, поэтому приведу пример для целых беззнаковых. Если ими воспользоваться, то можно сделать что-то вроде таких методов:
//Пример для 23F в шестнадцатеричной: 2 * 16^2 + 3 * 16 + 15 * 16^0 = 512 + 48 + 15 = 575 в десятичной.
public static ulong ToDecimal(string number, uint systemBase)
{
//Допустим, что лимитом для СС будет 36, чтобы обойтись латинскими символами для сохранения.
if (systemBase > 36 || systemBase < 2) throw new ArgumentOutOfRangeException("Основание системы счисления слишком велико для сохранения латинскими символами, либо слоишком мало для операций.");
ulong result = 0;
int position = number.Length - 1;
foreach (char c in number)
{
//Пусть в этой переменной будет значение символа.
int charValue = 0;
if (c >= '0' && c <= '9')//Если это десятичная цифра, то сохраняем как есть.
{
charValue = int.Parse(c.ToString());
}
else if (char.ToLower(c) >= 'a' && char.ToLower(c) <= 'z')//Для латинской буквы будет величина, начиная с 10.
{
charValue = char.ToLower(c) - 'a' + 10;
}
else throw new ArgumentException("В записи числа содержатся недопустимые символы.");
result += (ulong)charValue * (ulong)Math.Pow(systemBase, position--);//Добавляем значение.
}
return result;
}
//Ну и тут есть похожий алгоритм. Делим число на основание СС и записываем остатки от деления в обратном порядке.
public static string FromDecimal(ulong value, uint systemBase)
{
//Аналогичная проверка.
if (systemBase > 36 || systemBase < 2) throw new ArgumentOutOfRangeException("Основание системы счисления слишком велико для сохранения латинскими символами, либо слоишком мало для операций.");
string result = "";
do//Пока от числа хоть что-то осталось:
{
ushort remainder = (ushort)(value % systemBase);//находим остаток
if (remainder >= 0 && remainder <= 9)
{
//Если он десятичный, то добавим цифру в начале строки с ответом
result = remainder + result;
}
else
{
//Иначе добавим какую-нибудь латинскую букву.
result = (char)(remainder - 10 + 'a') + result;
}
value /= systemBase;
}
while (value > 0);
return result;
}
Понятно, что ulong я взял для примера (потому что понятия не имею, какие по длине числа вы собираетесь переводить).Данные методы нормально принимают и заглавные и строчные символы, но на выходе выдают строчные. Если нужно добавить больше символов, то делаете дополнительное условие, и переводите по тому же алгоритму. Так как char является числом от 0 до 65535, его можно использовать в математических операциях.
Что насчёт сложения и вычитания — можно перевести в десятичную, посчитать в десятичной, а потом перевести в нужную СС.
caseи тем самым расширю системы счисления, но как теперь перевести из десятичной в другую – Ilya Kvashnin Jan 11 '22 at 12:24