è½ç¶æçä¸æä¹æ ·åæ£æ¯å¯ä»¥ç¨
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ä¹å¯ä»¥ä¸è¦äº