C# :: Aufgabe #70 :: Lösung #11
14 Lösungen
#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
Zum Einstieg kann man erstmal die erste Zahl suchen , die durch alle Werte bis 20 geteilt werden kann.
Dieses ist 232792560
#11
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
C#-Code
berechnet n = 40000 in < 1s
und n = 100000 in < 5 s
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
Seite 1 von 0
1
