首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

算法有关问题.怎么用c#实现多项式相加

2012-11-07 
算法问题.如何用c#实现多项式相加.最近想学习下关于算法的知识.可是看到例子大部分是c程序,如果用c#实现的

算法问题.如何用c#实现多项式相加.
最近想学习下关于算法的知识.可是看到例子大部分是c程序,如果用c#实现的话比较困难.不安全代码不太会,
用静态链表也不是很懂.向高手求助..

[解决办法]
有固定输入模式没有?
[解决办法]
C#链表容易
[code=c#]
public class List <T>
{
class Node <T>
{
  T data;
  public Node <T> next;
  public Node(){this.next=null;this.data=defatule(T);}
}
Node <T> root;
public void Add(Node <T> n)
{
  n.next=root;
  root=n;
}
public IEnumerable <T> GetNodes()
{
  Node <T> current = root;
  if(current!=null)
  {
  yield return current;
  current=current.next;
  }
}
}
[/code]
楼主继续写,如何用链表具体实现,大家一起来学习.
[解决办法]
要下班了,只能写个很简陋的,不过大概的思路不会错的
输出:2*x^0+4*x^1+2*x^2+2*x^3+2*x^5+
格式比较丑陋,楼主可以自己再控制一下输出

C# code
using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication3{    class Program    {        static void Main(string[] args)        {            //新建一个表达式和一些新项,并向表达式中插入这些项            MyExpression me = new MyExpression();            MyItem item1 = new MyItem(2, 0);            MyItem item2 = new MyItem(2, 3);            MyItem item3 = new MyItem(2, 1);            MyItem item4 = new MyItem(2, 5);            MyItem item5 = new MyItem(2, 2);            me.InsertItem(item1);            me.InsertItem(item2);            me.InsertItem(item3);            me.InsertItem(item3);            me.InsertItem(item4);            me.InsertItem(item5);            foreach (MyItem mi in me.Expression)            {                Console.Write(mi.Num + "*x^" + mi.Exp + "+");            }            Console.ReadKey();        }    }    /// <summary>    /// 表达式类,用于存储所有的项    /// </summary>    class MyExpression    {        private List<MyItem> _expression;//用于存储表达式的项        internal List<MyItem> Expression        {            get { return _expression; }            set { _expression = value; }        }        /// <summary>        /// 初始化一个表达式        /// </summary>        public MyExpression()        {            Expression = new List<MyItem>();            MyItem item = new MyItem(0, 0);            Expression.Add(item);        }        /// <summary>        /// 插入一个项,根据指数来确定插入新项还是与原有项相加        /// </summary>        /// <param name="item"></param>        public void InsertItem(MyItem item)        {            int length = Expression.Count;            bool hasInserted = false;            for (int i = 0; i < length; i++)            {                if (Expression[i] > item) //当前项指数比插入项大时,插到当前项的位置                {                    Expression.Insert(i, item);                    hasInserted = true;                    break;                }                if (Expression[i].Exp == item.Exp)//指数相等时相加                {                    Expression[i].Num += item.Num;                    hasInserted = true;                    break;                }            }            if (!hasInserted)            {                Expression.Add(item);//指数比已知项都要大,插到表达式尾部            }        }        protected void Sort()        {            this.Expression.Sort();        }    }    /// <summary>    /// 结点类,存储每一项    /// </summary>    class MyItem : IComparable<MyItem>    {        private int _num;//倍娄        public int Num        {            get { return _num; }            set { _num = value; }        }        private int _exp;//指数        public int Exp        {            get { return _exp; }            set { _exp = value; }        }        /// <summary>        /// 给定值构造一个新项        /// </summary>        /// <param name="num"></param>        /// <param name="exp"></param>        public MyItem(int num, int exp)        {            Num = num;            Exp = exp;        }        public bool Compare(MyItem left, MyItem right)        {            if (left.Exp > right.Exp)            {                return true;            }            else                return false;        }        public int CompareTo(MyItem item)        {            return this.Exp.CompareTo(item.Exp);        }        public static bool operator >(MyItem left, MyItem right)        {            return left.Exp.CompareTo(right.Exp) > 0;        }        public static bool operator <(MyItem left, MyItem right)        {            return left.Exp.CompareTo(right.Exp) > 0;        }        //public object Clone()        //{        //    return new MyItem(this.Num,this.Exp);        //}    }} 


[解决办法]
这儿来个网上搜到的,已经成功通过本人的检验.(与原代码相比小有改变)

C# code
    //    using System;    namespace Polyn    {        public class Polynominal        {            int HighPower;//多项式的次数            double[] CoeffArray = new double[100];//数组用来存储多项式的系数,数组的项次表示多项式的次数            //olynominal p;        =new Polynominal();             public Polynominal()   //构造函数,初始化。            {                HighPower = 0;                int i;                for (i = 0; i < CoeffArray.Length; i++)                    CoeffArray[i] = 0;            }            public Polynominal(int Exponent)  //为了在测试时减少每次输入的麻烦,故设此构造函数。            {                HighPower = Exponent;                int i;                int t;                for (i = 0, t = 1; i <= Exponent; i++, t++)                {                    CoeffArray[i] = t * t;                }            }            /// <summary>            /// 读入多项式的系数和次数            /// </summary>            public void ReadIn()   //读入多项式的系数和次数            {                int Exponent;//次数                double Coefficient;                Console.WriteLine("当系数输入为0时表示多项式输入完毕.");                while (true)   //确保输入的数据有效                {                    Console.WriteLine("读入多项式的最高次数:");                    if (!(int.TryParse(Console.ReadLine(), out HighPower)))                    {                        Console.WriteLine(" 输入的不是整数,请重新输入");                        continue;                    }                    else                        break;                }                while (true)                {                    Console.WriteLine("输入某一项的次数(int型):");                    if (!(int.TryParse(Console.ReadLine(), out Exponent)))                    {                        Console.WriteLine("不是整数,请重新输入:");                        continue;   //确保输入的“次”符合要求                    }                    else if (Exponent > HighPower)                    {                        Console.WriteLine("该项次数大于多项式的最高次数,请重新输入:");                        continue;                    }                    Console.WriteLine("输入系数(浮点型):");                    while (true)                    {                        if (!(double.TryParse(Console.ReadLine(), out Coefficient)))                        {                            Console.WriteLine("输入的不是实数,请重新输入");                            continue;                        }                        break;                    }                    if (Coefficient == 0)   //退出条件,当系数为零时退出                        break;                    CoeffArray[Exponent] = Coefficient;                }            }            /// <summary>            /// 输出多项式,系数为零的不输出.            /// </summary>            public void PrintPoly()      //输出多项式,系数为零的不输出.            {                int i = 0;                Console.WriteLine();                Console.WriteLine("输出多项式:");                Console.Write("Poly:=");                while (CoeffArray[i] == 0)   //寻找第一个系数不为零的项                {                    i++;                }                if (i != 0 && i != 1) //当第一个系数不为零的项是次数为零 或为1的项需要作特殊处理。不能在输出结果中出现形如12X^0+1X^1的形式,正确表达应为12+x                {                    Console.Write("{0}X^{1}", CoeffArray[i], i);                }                else if (i == 0)                {                    Console.Write("{0}", CoeffArray[i]);                    i++;                    if (CoeffArray[i] != 1)                        Console.Write("+{0}X", CoeffArray[i]);                    else                        Console.Write("+X");                }                else if (CoeffArray[i] != 1)                    Console.Write("{0}X", CoeffArray[i]);                else                    Console.Write("X");                i++;                while (i < CoeffArray.Length)                {                    if (CoeffArray[i] != 0)                        Console.Write("+{0}X^{1}", CoeffArray[i], i);                    i++; 


[解决办法]
乘方运算没有添加进去,可参照下面的

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

namespace String_c
{
class string_c
{
public string_c()
{
}

private string lfrq(string str)
{
str = str.Replace("-", "+-");
str = str.Replace("++", "+");
str = str.Replace("*+", "*");
str = str.Replace("/+", "/");
while (str[0] == '+')
{
str = str.Substring(1);
}
return str;
}

public string 值计算(string str)
{
str = lfrq(str);
string str1, str2, str3, str4;
int index1, index2;
char cha;
int p = 0;
//取出括号内字符串计算
index1 = str.IndexOf('(');
if (index1 != -1)
{
index2 = 0;
for (int i = index1 + 1; i < str.Length; i++)
{
if (str[i] == '(') p++;
if (str[i] == ')')
{
if (p == 0) index2 = i;
else p--;
}
}
str1 = str.Substring(0, index1);
str2 = str.Substring(index1 + 1, index2 - index1 - 1);
str3 = str.Substring(index2 + 1);
str = str1 + 值计算(str2) + str3;
}
//取得运算符位置,优先乘除运算符
index1 =
(str.IndexOf('*') > 0 ? str.IndexOf('*') : 9999) <
(str.IndexOf('/') > 0 ? str.IndexOf('/') : 9999) ?
(str.IndexOf('*') > 0 ? str.IndexOf('*') : 9999) :
(str.IndexOf('/') > 0 ? str.IndexOf('/') : 9999);
if (index1 == 9999) index1 = str.IndexOf('+');
if (index1 == -1) return (str);
//取得运算符
cha = str[index1];
//取得运算符前一个数和后一个数及余下的字符串
str1 = str.Substring(0, index1);
str2 = str.Substring(index1 + 1, str.Length - 1 - index1);
index1 =
str1.LastIndexOf('*') > str1.LastIndexOf('/') ?
str1.LastIndexOf('8') : str1.LastIndexOf('/');
index1 =
str1.LastIndexOf('+') > index1 ?
str1.LastIndexOf('+') : index1;
str3 = str1.Substring(0, index1 + 1);
str1 = str1.Substring(index1 + 1, str1.Length - 1 - index1);
index1 = str2.IndexOf('*') > -1 ? str2.IndexOf('*') : 9999;
index2 = str2.IndexOf('/') > -1 ? str2.IndexOf('/') : 9999;
index1 = index1 < index2 ? index1 : index2;
index2 = str2.IndexOf('+') > -1 ? str2.IndexOf('+') : 9999;
index1 = index1 < index2 ? index1 : index2;
if (index1 == 9999)
{
str4 = str2;
str2 = "";
}
else
{
str4 = str2.Substring(0, index1);
str2 = str2.Substring(index1, str2.Length - index1);
}

//运算
double d1, d2;
str1 = str1.Replace("E", "E+");
str4 = str4.Replace("E", "E+");
if (str1[0] == '-') d1 = 0 - double.Parse(str1.Substring(1, str1.Length - 1));
else d1 = double.Parse(str1);
if (str4[0] == '-') d2 = 0 - double.Parse(str4.Substring(1, str4.Length - 1));
else d2 = double.Parse(str4);
switch (cha)


{
case '+':
d1 = d1 + d2;
break;
case '*':
d1 = d1 * d2;
break;
case '/':
d1 = d1 / d2;
break;
default:
break;
}
str = str3 + d1.ToString() + str2;
str = str.Replace("E+", "E");
index1 = str.IndexOf('+');
index1 =
str.IndexOf('*') > index1 ?
str.IndexOf('*') : index1;
index1 =
str.IndexOf('/') > index1 ?
str.IndexOf('/') : index1;
if (index1 == -1)
return str;
else
str = 值计算(str);

return str;
}
}
}

热点排行