M是一个抽象类,主要包含如下成员:
public int precise; //precise为有 效的小数位数,
public M(int precise) //例如, 4代表精确到0.0001小数位
public abstract decimal GetValue(); //计算e或π值
E和PI是分别继承了M的非抽象子类,对抽象方法GetValue
提供了基于以下公式的实现,用于计算e和π值:
e = 1+1/1!+1/2!+1/3!+1/4! ... +1/n!
4
= 1-1/3+1/5-1/7+1/9-1/11 ...
+(-1)n+1/ (2*n-1)
两式中的n均为自然数,通项公式值计算到precise指定的小
数位为止。为防止计算时间过长,结果的小数位应在4-9之间。
请自行编写主类,并调用E和PI中实现的GetValue方法输出
计算结果。程序应允许用户在运行时指定计算精度precise值,
并保证该值在程序设定的4-9之间。
 

using System;
namespace M
{
    internal class Program
    {
        static void Main(string[] args)
        {
            E e= new E(9);
            PI pi = new PI(7);
            Console.WriteLine(e.GetValue().ToString());
            Console.WriteLine(pi.GetValue().ToString());
            Console.ReadKey();


        }
    }
    public abstract class M
    {
        public int precise;
        public M(int precise)
        {
            if (precise < 4 || precise > 9)
                precise = 4;

            this.precise = precise; 
        }
        public abstract decimal GetValue();
    }
    public class E : M
    {
        public E(int precise):base(precise) {}

        public override decimal GetValue()
        {
            double result=1.0,n=1.0,c= Math.Pow(10.0, -precise);
            int i = 1;
            while (1 / n > c)
            {
                result += 1 / n;
                i++;
                n *= i;
            }
            result=(long)(result * Math.Pow(10.0, precise))*1.0 / Math.Pow(10.0, precise);
            return (decimal)result;
        }
    }

    public class PI : M
    {
        public PI(int precise) : base(precise) { }

        public override decimal GetValue()
        {
            int s = 1;
            double result = 0.0, n = 1.0,t=1.0, c = Math.Pow(10.0, -precise);
            
            while (Math.Abs(t) >c)
            {
                result += t;
                n += 2;
                s = -s;
                t = s / n;
            }
            result *= 4;
            result = (long)(result * Math.Pow(10.0, precise)) * 1.0 / Math.Pow(10.0, precise);
            return (decimal)result;
        }
    }
}