多项式相加数据结构及实现


设有两个多项式
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 作为数据结构,容纳其级数和系数.

ContractedBlock.gif ExpandedBlockStart.gif Code
 class Polynomial
    {
      
public  SortedDictionary<intint> 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
<intint> 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<intint> data)
        {
            this.Data 
= data;
        }

        
public Polynomial()
        {

        }

        
public override string ToString()
        {
            StringBuilder strList 
= new StringBuilder();
          
            foreach (KeyValuePair
<intint> 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 
- 11);
            }

            
return strList.ToString();
        }

    }

单元测试如下:

ContractedBlock.gif ExpandedBlockStart.gif Code

        
/// <summary>
        
///Add 的测试
        
///</summary>
        
[TestMethod()]
        
public void AddTest()
        {
           

            SortedDictionary
<intint> obj1 = new SortedDictionary<intint>();
            obj1.
Add(01);
            obj1.
Add(12);
            obj1.
Add(23);
            obj1.
Add(55);
            obj1.
Add(10010);

            SortedDictionary
<intint> obj2 = new SortedDictionary<intint>();
            obj2.
Add(02);
            obj2.
Add(23);
            obj2.
Add(44);
            obj2.
Add(51);
            obj2.
Add(66);

            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);


        }

转载于:https://www.cnblogs.com/netfuns/archive/2009/09/23/1572691.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值