C#练习题答案: 与伯努利的数字相处【难度:3级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战

与伯努利的数字相处【难度:3级】:答案1:using System;class AlongBern{ private static double bNb(int n) { if (n == 0) {return 1.0;} if (n == 1) {return -0.5;} if (n % 2 == 1) {return 0...
摘要由CSDN通过智能技术生成

与伯努利的数字相处【难度:3级】:

答案1:

using System;
class AlongBern
{
    private static double bNb(int n)
    {
        if (n == 0) {return 1.0;}
        if (n == 1) {return -0.5;}
        if (n % 2 == 1) {return 0.0;}
        BFraction[] bernoulli = new BFraction[n + 1];
        for (int m = 0; m <= n; ++m)
        {
           bernoulli[m] = new BFraction(1, m + 1);
           for (int j = m; j >= 1; --j)
           {
             bernoulli[j - 1].subk(bernoulli[j]);
             bernoulli[j - 1].mulk(j);
           }                                                                                                
        }
        BFraction b = bernoulli[0];
        return (double)b.numerk / (double)b.denomk;
    }
    private static double sIterative(int n, int terms)
    {
        double result = 0.0;
        int i = 1;
        while (i <= terms)
        {
            result += 1.0 / Math.Pow(i, n);
            i += 1;
        }
        return result;
    }
    private static long factorial(int n)
    {
        return (1 > n) ? 1 : n * factorial(n - 1);
    }
    public static double Series(int n, int nb)
    {
        double pi = 3.14159265358979;
        if (n >= 0)
        {
            if (n % 2 == 1) {return sIterative(n, nb);
            } else {
                return 0.5 * Math.Abs(bNb(n)) * (Math.Pow(2 * pi, n) / factorial(n));
            }
        } else {
            return Math.Pow(-1, (-n)) * bNb(-n + 1) / (-n + 1);
        }
    }
}

答案2:

using System;

class AlongBern {
    public static double Zeta(int k, int precision = 50) {
        if (k < 0)
            return 2.0 * Math.Pow(2 * Math.PI, k - 1) * Math.Cos(Math.PI * (1 - k) * 0.5) * Fact(-k) * Zeta(1 - k);

        double sum = 0;
        for (int n = 0; n < precision; n++) {
            double partial = 0;
            for (int m = 0; m <= n; m++)
                partial += (m % 2 == 0 ? 1.0 : -1.0) * Binomial(n, m) * Math.Pow(m + 1, -k);
            sum += partial / Math.Pow(2, n + 1);
        }

        return sum / (1 - Math.Pow(2, 1 - k));
    }

    public static double Bernoulli(int k)
        => (k % 2 == 0 ? -1.0 : 1.0) * k * Zeta(1 - k);
        
    public static double Binomial(int n, int k)
        => Fact(n) / (Fact(k) * Fact(n - k));

    public static double Fact(int n)
        => n <= 1 ? 1 : n * Fact(n - 1);

    public static double Series(int k, int nb)
        => k >= 2 ?
            (k % 2 == 0 ?
                (Math.Pow(2, k - 1) * Math.Pow(Math.PI, k) * Math.Abs(Bernoulli(k))) / Fact(k)
                : Zeta(k))
            : k < -1 ? (k % 2 == 0 ? 1.0 : -1.0) * Bernoulli(-k + 1) / (-k + 1.0) : double.NaN;
}

答案3:

using System;
using System.Linq;
class AlongBern
{
        public static double Series(int k, int nb)
        {
            double pi = 3.14159265358979;
            double result = 0;
            double[] b = new double[] {1, -1f/2f, 1f/6f, 0 , -1f/30f,0,1f/42f,0,-1f/30f, 0, 5f/66f,0,-691f/2730f,0,7f/6f,0,
                -3617f/510f,0,43867f/798f,0,-174611f/330f,0,
                6192.123188405,0,-86580.2531135531135,0,8553103f/6f,0, -27298231.06781609195};
    
            if (k > 2 &amp;&amp; k % 2 == 1)
                result = Enumerable.Range(1, nb).Sum(x => 1 / Math.Pow(x, k));
            if (k >= 2 &amp;&amp; k % 2 == 0)
            {
                double fact = 1;
                for (int i = 1; i <= k; i++)
                    fact *= i;
                result = 0.5 * Math.Abs((double)b[k]) * Math.Pow(2 * pi, k) /fact;
            }
            if (k < -1)
            {
                k *= -1;
                result = Math.Pow(-1, k) * (double)b[k + 1] / (k + 1);
            }
            return (double)result;
        }
}

答案4:

using System;
using System.Collections.Generic;

public class AlongBern {
    public static double Series( int k, int nb ) {
        if ( k >= 2 ) {
            if ( k%2 != 0 ) {
                return F1( k, nb );
            }
            return F2( k );
        }
        return F3( -k );
    }

    private static double F1( int k, int nb ) {
        double sum = 0;
        for ( int i = 1; i <= nb; i++ ) {
            sum += ( 1/Math.Pow( i, k ) );
        }
        return sum;
    }

    private static double F2( int k ) {
        return 1.0/2*Math.Abs( Bn( k ) )*Math.Pow( 2*Math.PI, k )/F( k );
    }

    private static double F3( int k ) {
        return Math.Pow( -1, k )*Bn( k + 1 )/( k + 1 );
    }

    private static readonly Dictionary<int, long> FactorsTable = new Dictionary<int, long> {
        {0, 1},
        {1, 1},
        {2, 2},
        {3, 6},
        {4, 24},
        {5, 120},
        {6, 720},
        {7, 5040},
        {8, 40320},
        {9, 362880},
        {10, 3628800},
        {11, 39916800},
        {12, 479001600}
    };

    private static long F( int n ) {
        if ( n <= 1 ) {
            return 1;
        }
        if ( !FactorsTable.ContainsKey( n ) ) {
            FactorsTable [ n ] = n*F( n - 1 );
        }
        return FactorsTable [ n ];
    }

    private static long C( int n, int k ) {
        if ( k > n ) {
            return 0;
        }
        var coefficient = 1;
        for ( var i = 1; i <= k; i++ ) {
            coefficient *= n--;
            coefficient /= i;
        }
        return coefficient;
    }

    private static readonly Dictionary<int, double> BernoulliNumbers = new Dictionary<int, double> {
        {0, 1}
    };

    private static double Bn( int n ) {
        if ( !BernoulliNumbers.ContainsKey( n ) ) {
            double sum = 0;
            for ( int i = 0; i <= n - 1; i++ ) {
                sum += C( n, i )*Bn( i )/( n - i + 1 );
            }
            BernoulliNumbers [ n ] = 1 - sum;
        }
        return BernoulliNumbers [ n ];
    }

}

答案5:

using System;

class AlongBern {
    public static double Zeta(int k, int precision = 2000000) {
        if (k < 0)
            return 2.0 * Math.Pow(2 * Math.PI, k - 1) * Math.Cos(Math.PI * (1 - k) * 0.5) * Fact(-k) * Zeta(1 - k);

        double sum = 0;
        for (int n = 1; n < precision; n++)
            sum += Math.Pow(n, -k);
        return sum;
    }

    public static double Bernoulli(int k)
        => (k % 2 == 0 ? -1.0 : 1.0) * k * Zeta(1 - k);

    public static double Fact(int n)
        => n <= 1 ? 1 : n * Fact(n - 1);

    public static double Series(int k, int nb)
        => k >= 2 ?
            (k % 2 == 0 ?
                (Math.Pow(2, k - 1) * Math.Pow(Math.PI, k) * Math.Abs(Bernoulli(k))) / Fact(k)
                : Zeta(k, nb))
            : k < -1 ? (k % 2 == 0 ? 1.0 : -1.0) * Bernoulli(-k + 1) / (-k + 1.0) : double.NaN;
}

答案6:

using System;
using System.Collections.Generic;

class AlongBern
{
    public static long Factorial(int n)=> (1>n) ? 1 : n*Factorial(n-1);

    public static List<int> LowBern(int n)
    {
        List<int> arr = new List<int>();
        int value = 1;
        for (int i=0; i<n; ++i)
        {
            arr.Add(value);
            value = value*(n-i)/(i+1);
        }
        return arr;
    }

    public static double BernoulliNum(int n)
    {
        List<double> arr = new List<double>();
        arr.Add(-0.5);
        double bern;
        for (int i=1; i<=n; ++i)
        {
            bern = 1;
            for (int j=1; j<=i; ++j)               
                bern = bern + LowBern(i+2)[j] * arr[j-1];
                
            bern = (-1.0/(i+2)) * bern;
            arr.Add(bern);
        }
        return arr[n-1];
    }

    public static double Series(int k, int nb)
    {
        double pi = 3.14159265358979;
        double d = 0.0;
        
        if (k>2 &amp;&amp; k%2==1)          
            for (int i=1; i<=nb; ++i)                
                d = d+1.0 / Math.Pow(i,k);                        

        if (k>=2 &amp;&amp; k%2==0)
        {
            d=1;
            for (int i=1; i<=k; ++i)              
                d = d*2 * pi/i;               
            d = (1.0 / 2.0) * Math.Abs(BernoulliNum(k)) * d;
        }
            
        if (k<-1)
        {
            int kk = Math.Abs(k);
            d = Math.Pow(-1,kk) * BernoulliNum(kk+1) / (kk+1);
        }
        return d;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值