C# :: Aufgabe #70 :: Lösung #11

14 Lösungen Lösungen öffentlich
#70

Finde die erste Zahl die durch alle Zahlen bis 30teilbar ist

Fortgeschrittener - C# von 96fabi - 25.09.2014 um 09:01 Uhr
Gesucht wird die erste Zahl, die durch alle Zahlen bis 30 geteilt werden kann(1-30).
Zum Einstieg kann man erstmal die erste Zahl suchen , die durch alle Werte bis 20 geteilt werden kann.
Dieses ist 232792560
#11
vote_ok
von dragonmaster (250 Punkte) - 05.01.2016 um 10:53 Uhr
Mit dynamischer Eingabe, Zeitberechnung und Ausgabe der Anzahl der Ziffern der gefundenen Zahl.

berechnet n = 40000 in < 1s
und n = 100000 in < 5 s

Quellcode ausblenden C#-Code
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;
using System.Diagnostics;


namespace Teilbar30
{
    class Program
    {
        static Stopwatch stop = new Stopwatch();
        static void Main(string[] args)
        {
            Console.WriteLine("Berechnung der kleinsten zahl die durch 1 bis 'n' teilbar ist.");
            int input = 0;
            while (true)
            {
                Console.Write("\nBitte 'n' eingeben: ");
                try
                {
                    input = Convert.ToInt32(Console.ReadLine());
                }
                catch
                {
                    Console.WriteLine("Bitte eine Z A H L eingeben!\n");
                    continue;
                }

                Berechnen(input);
            }


        }

        static void Berechnen(int input)
        {
            stop.Start();
            BigInteger ergebnis = 1;
            List<int> RelevantePrimzahlen = PrimzahlenGenerieren(input);
            int[,] PrimzahlenMitExponenten = new int[RelevantePrimzahlen.Count, 2];

            for (int i = 0; i < RelevantePrimzahlen.Count; i++)
            {
                PrimzahlenMitExponenten[i, 0] = (int)RelevantePrimzahlen[i];
            }

            // Primfaktorzerlegung
            for (int i = 2; i <= input; i++)
            {
                int rest = i;
                int teiler = 2;
                List<int> PrimzahlenTemp = new List<int>();

                while (rest > 1)
                {
                    if (rest % teiler == 0)
                    {
                        PrimzahlenTemp.Add(teiler);
                        rest /= teiler;
                        continue;
                    }
                    teiler++;
                }

                //Prüfung of die gespeichete Exponentenzahlen kleiner sind als die aktuellen
                for (int a1 = 0; a1 < PrimzahlenMitExponenten.GetLength(0); a1++)
                {
                    int Exponent = 0;
                    int a2 = 0;
                    while (a2 < PrimzahlenTemp.Count)
                    {
                        if (PrimzahlenMitExponenten[a1, 0] == PrimzahlenTemp[a2])
                        {
                            Exponent++;
                            PrimzahlenTemp.RemoveAt(a2);
                            continue;
                        }
                        a2++;
                    }
                    if (Exponent > PrimzahlenMitExponenten[a1, 1])
                    {
                        PrimzahlenMitExponenten[a1, 1] = Exponent;
                    }
                    if (PrimzahlenTemp.Count <= 0)
                    {
                        break;
                    }
                }
            }
            //alle Primfaktoren zusammerrechnen
            for (int f = 0; f < PrimzahlenMitExponenten.GetLength(0); f++)
            {
                for (int e = 0; e < PrimzahlenMitExponenten[f, 1]; e++)
                {
                    ergebnis *= Convert.ToUInt64(PrimzahlenMitExponenten[f, 0]);
                }
            }
            stop.Stop();
            Console.WriteLine("{0}\nist von 1 bis {1} teilbar und hat {2} Stellen.\nBerechnet in {3}\n\n"
                , ergebnis, grenze, CountDigits(ergebnis), stop.Elapsed);
            stop.Reset();
        }

        static int StellenZaehlen(BigInteger input)
        {
            int ziffern = 0;

            String s = input.ToString();
            ziffern = s.Length;

            return ziffern;
        }
        static List<int> PrimzahlenGenerieren(int input)
        {
            bool teilbar;
            List<int> Primzahlen = new List<int>();
            Primzahlen.Add(2);
            for (int i = 2; i <= input; i++)
            {
                teilbar = false;
                foreach (int x in Primzahlen)
                {
                    if (i % x == 0)
                    {
                        teilbar = true;
                        break;
                    }
                }
                if (!teilbar)
                {
                    Primzahlen.Add(i);
                }
            }
            return Primzahlen;
        }


    }
}

Kommentare:

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

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