运用C#数据结构编写程序进行一元多项式的计算

能够按照指数降序序列排列建立并输出多项式,能够完成两个多项式的相加,相减,相乘和相除,并将结果输出,要详细的代码

虽然效率不怎么样反正是可以用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Polynomial
    {
        class RankFactorMap
        {
            public int rank_;
            public double factor_;
        }
        List<RankFactorMap> data_;
        public Polynomial(params double[] factors)
        {
            data_ = new List<RankFactorMap>();
            for (int i = 0; i < factors.Length; ++i)
                data_.Add(new RankFactorMap() { rank_ = i, factor_ = factors[i] });
        }
        double this[int rank]
        {
            get
            {
                if (rank < 0) throw new ArgumentOutOfRangeException();
                var r = data_.FirstOrDefault(x => x.rank_ == rank);
                if (r != null)
                    return r.factor_;
                else
                    return 0;
            }
            set
            {
                if (rank < 0) throw new ArgumentOutOfRangeException();
                var r = data_.FirstOrDefault(x => x.rank_ == rank);
                if (r == null)
                    data_.Add(new RankFactorMap() { rank_ = rank, factor_ = value });
                else
                    r.factor_ = value;
            }
        }
        override public string ToString()
        {
            StringBuilder r = new StringBuilder();
            bool isFirst = true;
            foreach(var x in data_.OrderByDescending(i => i.rank_))
            {
                if (x.rank_ == 0 && x.factor_ > 0 && isFirst == false)
                    r.AppendFormat("+{0}", x.factor_);
                else if (x.rank_ == 0 && (x.factor_ > 0 && isFirst == true || x.factor_ < 0))
                    r.AppendFormat("{0}", x.factor_);
                else if (x.rank_ == 1 && x.factor_ > 0 && isFirst == false)
                    r.AppendFormat("+{0}x", x.factor_);
                else if (x.rank_ == 1 && (x.factor_ > 0 && isFirst == true || x.factor_ < 0))
                    r.AppendFormat("{0}x", x.factor_);
                else if (x.factor_ > 0 && isFirst == false)
                    r.AppendFormat("+{0}x^{1}", x.factor_, x.rank_);
                else if (x.factor_ > 0 && isFirst == true || x.factor_ < 0)
                    r.AppendFormat("{0}x^{1}", x.factor_, x.rank_);
                isFirst = false;
            }
            return r.ToString();
        }
        class RankEq : IEqualityComparer<RankFactorMap>
        {
            public bool Equals(RankFactorMap x, RankFactorMap y)
            {
                return x.rank_ == y.rank_;
            }
            public int GetHashCode(RankFactorMap obj)
            {
                return obj.GetHashCode();
            }
            public static RankEq Instance = new RankEq();
        }

        public static Polynomial operator +(Polynomial lhs, Polynomial rhs)
        {
            var r = new Polynomial();
            r.data_ = lhs.data_.Join(rhs.data_, x => x.rank_, y => y.rank_, (x, y) => new RankFactorMap() { rank_ = x.rank_, factor_ = x.factor_ + y.factor_ }).Concat(rhs.data_.Except(lhs.data_, RankEq.Instance)).ToList();
            return r;
        }
        public static Polynomial operator -(Polynomial lhs, Polynomial rhs)
        {
            var r = new Polynomial();
            r.data_ = lhs.data_.Join(rhs.data_, x => x.rank_, y => y.rank_, (x, y) => new RankFactorMap() { rank_ = x.rank_, factor_ = x.factor_ - y.factor_ }).Concat(rhs.data_.Except(lhs.data_, RankEq.Instance)).Select(x => new RankFactorMap() { rank_ = x.rank_, factor_ = -x.factor_}).ToList();
            return r;
        }
        public static Polynomial operator *(Polynomial lhs, Polynomial rhs)
        {
            Polynomial r = new Polynomial();
            lhs.data_.Join(rhs.data_, x => true, y => true, (x, y) => new RankFactorMap() { rank_ = x.rank_ + y.rank_, factor_ = x.factor_ * y.factor_ }).ToList().ForEach(x => r[x.rank_] = r[x.rank_] + x.factor_);
            return r;
        }
        public static Polynomial operator /(Polynomial lhs, Polynomial rhs)
        {
            throw new Exception("怎么除,不会除");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Polynomial p = new Polynomial(3, 2, 1);
            Console.WriteLine(p);
            Polynomial q = new Polynomial(4, 3, 2, 1);
            Console.WriteLine(q);
            Console.WriteLine(p + q);
            Console.WriteLine(p - q);
            Console.WriteLine(p * q);
            return;
        }
    }
}追问

表示看不懂……可以解释下吗……感谢

表示看不懂……可以解释下吗……感谢

追答

这……也没啥太多解释的

一个RankFactorMap的链表,rank代表阶,factor代表系数

tostring我觉得花点时间理解不太难

this[]就是索引器,用下标来获取和设置系数

要讲的可能也就加减乘了。现在那些查询代码写得太恶心好像还有bug我把自己绕进去了……

然后想了想既然写了那样的索引器其实不用写这么恶心的查询

可以这样


public static Polynomial operator +(Polynomial lhs, Polynomial rhs)
{
    var r = new Polynomial();
    r.data_ = lhs.data_.ToList();
    foreach (var x in rhs.data_) r[x.rank_] = r[x.rank_] + x.factor_;
    return r;
}
public static Polynomial operator -(Polynomial lhs, Polynomial rhs)
{
    var r = new Polynomial();
    r.data_ = lhs.data_.ToList();
    foreach (var x in rhs.data_) r[x.rank_] = r[x.rank_] - x.factor_;
    return r;
}
public static Polynomial operator *(Polynomial lhs, Polynomial rhs)
{
    Polynomial r = new Polynomial();
    foreach (var x in lhs.data_)
        foreach (var y in rhs.data_)
            r[x.rank_ + y.rank_] = r[x.rank_ + y.rank_] + x.factor_ * y.factor_;
    return r;
}

应该很容易看懂了。RankEq也可以不要了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-08
数学不太懂,你写个数学例子 ,在联系我给你写追问

就比如输入一个多项式x的五次方加x的四次方加2x的三次方然后再输入另外一个 然后做运算

第2个回答  2014-12-08
这个问题很复杂,没办法帮助你
相似回答