题目详情
在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),给定两个二十进制整数,求它们的和。
输入是两个二十进制整数,且都大于0,不超过100位;
输出是它们的和(二十进制),且不包含首0。我们用字符串来表示二十进制整数。
class Program
{
static void Main(string[] args)
{
string s = Sum("abc", "abc"); // 1134
Console.WriteLine(s);
Console.Read();
}
/// <summary>
/// 二十进制相加
/// </summary>
/// <param name="a">字符串a</param>
/// <param name="b">字符串b.</param>
/// <returns></returns>
static string Sum(string a, string b)
{
int len = a.Length > b.Length ? a.Length + 1 : b.Length + 1;
char[] ar = new char[len];
int i = 0;
int ai = a.Length - 1;
int bi = b.Length - 1;
int t;
int ad = 0;
while (ai >= 0 || bi >= 0)
{
if (ai >= 0 && bi >= 0)
{
t = Map(a[ai]) + Map(b[bi]) + ad;
}
else if (ai >= 0)
{
t = Map(a[ai]) + ad;
}
else
{
t = Map(b[bi]) + ad;
}
ar[i++] = RMap(t % 20);
ad = t / 20;
ai--;
bi--;
}
if (ad > 0)
{
ar[i] = '1';
}
int h = ar.Length - 1;
while (ar[h] == '\0')
{
h--;
}
string s = "";
while (h >= 0)
{
s += ar[h--];
}
return s;
}
/// <summary>
/// Maps the specified c.
/// a -> 10 , j-> 19 , others exception
/// </summary>
/// <param name="c">The c.</param>
/// <returns></returns>
/// <exception cref="System.ArgumentException">c</exception>
static int Map(char c)
{
c = char.ToLower(c);
if (c >= 'a' && c <= 'j')
{
return 10 + (c - 'a');
}
throw new ArgumentException("c");
}
/// <summary>
///Map int to char, 10 -> a , 19 -> j
/// </summary>
/// <param name="i">The i.</param>
/// <returns></returns>
/// <exception cref="System.ArgumentException">i</exception>
static char RMap(int i)
{
if (i >= 10 && i <= 19)
{
return Convert.ToChar(87 + i);
}
else if (i < 10)
{
return i.ToString()[0];
}
throw new ArgumentException("i");
}
}