144 lines
4.5 KiB
C#
144 lines
4.5 KiB
C#
using System;
|
|
using System.Collections;
|
|
|
|
namespace ConvertNumberSystems
|
|
{
|
|
class Program
|
|
{
|
|
static ArrayList symbols = new ArrayList();
|
|
static long maxCommas = 5;
|
|
|
|
static void Main(string[] args) {
|
|
Console.Clear();
|
|
|
|
// Initialize Symbols
|
|
for (int i = 48; i <= 57; i++) { symbols.Add((char)i); }
|
|
for (int i = 65; i <= 90; i++) { symbols.Add((char)i); }
|
|
|
|
|
|
// Get Input
|
|
Console.Write("Input your first number: ");
|
|
string number1 = Console.ReadLine();
|
|
|
|
Console.Write("Input the base of that number: ");
|
|
long base1 = Convert.ToInt64(Console.ReadLine());
|
|
|
|
Console.Write("Input your second number: ");
|
|
string number2 = Console.ReadLine();
|
|
|
|
Console.Write("Input the base of that number: ");
|
|
long base2 = Convert.ToInt64(Console.ReadLine());
|
|
|
|
Console.Write("Input the operator to use on the numbers: ");
|
|
string inOp = Console.ReadLine();
|
|
|
|
Console.Write("Input the base your output Number: ");
|
|
long outputBase = Convert.ToInt64(Console.ReadLine());
|
|
|
|
|
|
// Calculate Numbers
|
|
double aTD1 = anyToDecimal(number1, base1);
|
|
double aTD2 = anyToDecimal(number2, base2);
|
|
|
|
string result = "";
|
|
switch (inOp[0]) {
|
|
case '+':
|
|
result = decimalToAny(aTD1 + aTD2, outputBase);
|
|
break;
|
|
case '-':
|
|
result = decimalToAny(aTD1 - aTD2, outputBase);
|
|
break;
|
|
case '*':
|
|
result = decimalToAny(aTD1 * aTD2, outputBase);
|
|
break;
|
|
case '/':
|
|
result = decimalToAny(aTD1 / aTD2, outputBase);
|
|
break;
|
|
default:
|
|
result = "None";
|
|
break;
|
|
}
|
|
|
|
Console.WriteLine("Your resulting number is: {0}", result);
|
|
Console.ReadKey();
|
|
}
|
|
|
|
static double anyToDecimal(string number, long _base)
|
|
{
|
|
if (_base == 10) { return Convert.ToDouble(number); }
|
|
if (_base > symbols.Count || _base < 2) { return 0d; }
|
|
|
|
string removeComma = "";
|
|
bool foundComma = false;
|
|
long afterComma = 0;
|
|
for (int i = 0; i < number.Length; i++)
|
|
{
|
|
if (afterComma == maxCommas) { break; }
|
|
if (number[i] != ',')
|
|
{
|
|
removeComma += number[i];
|
|
if (foundComma)
|
|
{
|
|
afterComma++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foundComma = true;
|
|
}
|
|
}
|
|
|
|
double value = 0;
|
|
string upperCase = removeComma.ToUpper();
|
|
for (int i = 0; i < removeComma.Length; i++)
|
|
{
|
|
long position = removeComma.Length - i - 1 - afterComma;
|
|
char current = upperCase[i];
|
|
for (long j = 0; j < _base; j++)
|
|
{
|
|
if (current == (char)symbols[Convert.ToInt32(j)])
|
|
{
|
|
value += j * (double)Math.Pow(_base, position);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
|
|
static string decimalToAny(double number, long _base)
|
|
{
|
|
string b = "";
|
|
if (_base == 10)
|
|
{
|
|
return b + number;
|
|
}
|
|
if (_base > symbols.Count || _base < 2) { return b; }
|
|
long hP = (long)Math.Floor((double)Math.Log((double)number) / Math.Log((double)_base));
|
|
if (hP < 0) { hP = 0; }
|
|
double t = number;
|
|
long index = hP;
|
|
while ((t > (double)Math.Pow(10, -maxCommas-1)) && (index > -maxCommas-1))
|
|
{
|
|
if (index == -1)
|
|
{
|
|
b += ",";
|
|
}
|
|
double p = (double)Math.Pow((double)_base, (double)index);
|
|
double d = (double)Math.Floor((double)t / p);
|
|
if ((double)Math.Abs(p * d) <= t)
|
|
{
|
|
t -= d * p;
|
|
b += "" + symbols[Convert.ToInt32(d)];
|
|
}
|
|
else
|
|
{
|
|
b += "0";
|
|
}
|
|
index--;
|
|
}
|
|
return b;
|
|
}
|
|
}
|
|
}
|