设有两个多项式
p1:1+2x+3x^2+5x^5+10x^100
p2:2+3x^2+4x^4+1x^5+6x^6
其相加的结果应为
p3:3+2x+6x^2+4x^4+6x^5+6x^6+10x^100
应如何设计其数据结构和算法?
方法如下:
定义一个类Polynomial
采用SortedDictionary<int, int> Data 作为数据结构,容纳其级数和系数.
Code
class Polynomial
{
public SortedDictionary<int, int> Data=new SortedDictionary<int,int>();
public static Polynomial operator+ (Polynomial p1,Polynomial p2)
{
return p1.Add(p2);
}
public Polynomial Add(Polynomial other)
{
Polynomial result = new Polynomial();
foreach (KeyValuePair<int, int> pair in this.Data)
{
result.Data.Add(pair.Key, pair.Value);
}
foreach (int keyItem in other.Data.Keys)
{
if (result.Data.ContainsKey(keyItem))
{
result.Data[keyItem] = result.Data[keyItem] + other.Data[keyItem];
}
else
{
result.Data.Add(keyItem, other.Data[keyItem]);
}
}
return result;
}
public Polynomial(SortedDictionary<int, int> data)
{
this.Data = data;
}
public Polynomial()
{
}
public override string ToString()
{
StringBuilder strList = new StringBuilder();
foreach (KeyValuePair<int, int> pair in this.Data)
{
string temp = pair.Value.ToString(); ;
if (pair.Key >=1)
{
temp += "x";
}
if (pair.Key > 1)
{
temp += "^" + pair.Key;
}
temp+="+";
strList.Append(temp);
}
if (strList.Length >= 1)
{
strList.Remove(strList.Length - 1, 1);
}
return strList.ToString();
}
}
class Polynomial
{
public SortedDictionary<int, int> Data=new SortedDictionary<int,int>();
public static Polynomial operator+ (Polynomial p1,Polynomial p2)
{
return p1.Add(p2);
}
public Polynomial Add(Polynomial other)
{
Polynomial result = new Polynomial();
foreach (KeyValuePair<int, int> pair in this.Data)
{
result.Data.Add(pair.Key, pair.Value);
}
foreach (int keyItem in other.Data.Keys)
{
if (result.Data.ContainsKey(keyItem))
{
result.Data[keyItem] = result.Data[keyItem] + other.Data[keyItem];
}
else
{
result.Data.Add(keyItem, other.Data[keyItem]);
}
}
return result;
}
public Polynomial(SortedDictionary<int, int> data)
{
this.Data = data;
}
public Polynomial()
{
}
public override string ToString()
{
StringBuilder strList = new StringBuilder();
foreach (KeyValuePair<int, int> pair in this.Data)
{
string temp = pair.Value.ToString(); ;
if (pair.Key >=1)
{
temp += "x";
}
if (pair.Key > 1)
{
temp += "^" + pair.Key;
}
temp+="+";
strList.Append(temp);
}
if (strList.Length >= 1)
{
strList.Remove(strList.Length - 1, 1);
}
return strList.ToString();
}
}
单元测试如下:
Code
/// <summary>
///Add 的测试
///</summary>
[TestMethod()]
public void AddTest()
{
SortedDictionary<int, int> obj1 = new SortedDictionary<int, int>();
obj1.Add(0, 1);
obj1.Add(1, 2);
obj1.Add(2, 3);
obj1.Add(5, 5);
obj1.Add(100, 10);
SortedDictionary<int, int> obj2 = new SortedDictionary<int, int>();
obj2.Add(0, 2);
obj2.Add(2, 3);
obj2.Add(4, 4);
obj2.Add(5, 1);
obj2.Add(6, 6);
Polynomial p1 = new Polynomial(obj1);
Polynomial p2 = new Polynomial(obj2);
Polynomial p3 = p1.Add(p2);
bool succ = true;
SortedDictionary<int,int> dic=p3.Data;
if (!(dic[0] == 3))
{
succ = false;
}
if (!(dic[1] == 2))
{
succ = false;
}
if (!(dic[2] == 6))
{
succ = false;
}
if (!(dic[4] == 4))
{
succ = false;
}
if (!(dic[5] == 6))
{
succ = false;
}
if (!(dic[6] == 6))
{
succ = false;
}
if (!(dic[100] == 10))
{
succ = false;
}
Assert.AreEqual(succ, true);
Debug.WriteLine(p1.ToString());
Debug.WriteLine(p2.ToString());
Debug.WriteLine(p3.ToString());
string targetStr = "3+2x+6x^2+4x^4+6x^5+6x^6+10x^100";
string str = p3.ToString();
Assert.AreEqual(targetStr, str);
}
/// <summary>
///Add 的测试
///</summary>
[TestMethod()]
public void AddTest()
{
SortedDictionary<int, int> obj1 = new SortedDictionary<int, int>();
obj1.Add(0, 1);
obj1.Add(1, 2);
obj1.Add(2, 3);
obj1.Add(5, 5);
obj1.Add(100, 10);
SortedDictionary<int, int> obj2 = new SortedDictionary<int, int>();
obj2.Add(0, 2);
obj2.Add(2, 3);
obj2.Add(4, 4);
obj2.Add(5, 1);
obj2.Add(6, 6);
Polynomial p1 = new Polynomial(obj1);
Polynomial p2 = new Polynomial(obj2);
Polynomial p3 = p1.Add(p2);
bool succ = true;
SortedDictionary<int,int> dic=p3.Data;
if (!(dic[0] == 3))
{
succ = false;
}
if (!(dic[1] == 2))
{
succ = false;
}
if (!(dic[2] == 6))
{
succ = false;
}
if (!(dic[4] == 4))
{
succ = false;
}
if (!(dic[5] == 6))
{
succ = false;
}
if (!(dic[6] == 6))
{
succ = false;
}
if (!(dic[100] == 10))
{
succ = false;
}
Assert.AreEqual(succ, true);
Debug.WriteLine(p1.ToString());
Debug.WriteLine(p2.ToString());
Debug.WriteLine(p3.ToString());
string targetStr = "3+2x+6x^2+4x^4+6x^5+6x^6+10x^100";
string str = p3.ToString();
Assert.AreEqual(targetStr, str);
}