C# :: Aufgabe #183 :: Lösung #1

4 Lösungen Lösungen öffentlich
#183

Funktion um Pi zu berechnen.

Anfänger - C# von Felix - 09.07.2017 um 21:59 Uhr
Schreibe eine Methode um Pi zu berechnen. Versuche Pi auf so viele Stellen wie möglich zu berechnen.
#1
vote_ok
von hollst (13980 Punkte) - 12.07.2017 um 16:41 Uhr
Quellcode ausblenden C#-Code
using System;
using static System.Console;
using System.Numerics; //muss zu Verweisen hinzugefügt werden
using System.Diagnostics;

namespace pi_183{

    class Program    {

        static string NL = Environment.NewLine, LZ = " ";

        static void Main()        {

            Stopwatch sw = new Stopwatch();
            sw.Start();

            int genauigkeit = 1001;

            WriteLine("Garantierte Genauigkeit: " + (genauigkeit - 1).ToString("n0") + " Nachkommastellen" + NL);

            int n = 10;                      
            BigInteger pi1 = 0, pi2 = 0;

            bool bo_ok = false;
            while (!bo_ok)            {  
                              
                pi1 = pi2;

                rational L2 = new rational();
                L2 = Lambert(1, n + 1);

                BigInteger p2 = BigInteger.Pow(10, L2.zaehler.ToString().Length);
                pi2 = p2 * 4 * L2.nenner / L2.zaehler;

                int identisch = pi2.identisch_bis(pi1);
                bo_ok = genauigkeit <= identisch;
                
                n++;              
            }            

            WriteLine(pi2.ToString().MitCharAnzahl(genauigkeit));
            WriteLine(NL + Math.PI * Math.Pow(10, 14));

            sw.Stop();
            TimeSpan ts = sw.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            WriteLine(NL + "Rechenzeit " + elapsedTime);

            ReadKey();
        }

        #region biginteger region

        public struct rational 
        {
            public BigInteger zaehler;
            public BigInteger nenner;
        }

        public static rational div(rational z1, rational z2)        {
            rational erg;
            erg.zaehler = z1.zaehler * z2.nenner;
            erg.nenner = z1.nenner * z2.zaehler;
            return erg;
        }

        public static rational add(rational z1, rational z2)        {
            rational erg;
            erg.nenner = z1.nenner * z2.nenner;
            erg.zaehler = z1.zaehler * z2.nenner + z2.zaehler * z1.nenner;
            return erg;
        }

        public static rational Lambert(int k, int n)        {   // nach Lamberts Kettenbruch
                                                                // lambert(k) = 2 * k - 1 + k * k / lambert(k + 1)
            rational erg;
            if (k == n)
            {
                erg.zaehler = 1;
                erg.nenner = 1;
                return erg;
            }
            rational a, b;
            a.zaehler = 2 * k - 1; a.nenner = 1;
            b.zaehler = k * k; b.nenner = 1;

            erg = add(a, div(b, Lambert(k + 1, n)));

            return erg;
        }
    
        #endregion
    }

    public static class MyExtensions    {

        public static string MitCharAnzahl(this string s, int chars)        {
            string result = string.Empty;
            for (var i = 0; i < s.Length; i++)
                if (i < chars)
                    result += s[i].ToString();
                else
                    break;
            return result;
        }

        public static int identisch_bis(this BigInteger z1, BigInteger z2)
        {
            int result = 0;
            char[] c1 = z1.ToString().ToCharArray();
            char[] c2 = z2.ToString().ToCharArray();
            for (var i = 0; i < Math.Min(c1.Length, c2.Length); i++)
                if (c1[i] == c2[i])
                    result++;
                else
                    break;
            return result;
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben