Periodenlänge von Dezimalbrüchen (Schleifen)
Stammbrüche sind Brüche der Form \frac{1}{37}.
Jeder Stammbruch kann auch als Dezimalbruch dargestellt werden. So ist beispielsweise
\frac{1}{4} = 0.25 und
\frac{1}{6} = 0.16666... = 0.1\overline{6}
Jeder natürlichen Zahl (1, 2, 3, ...) kann also ein Dezimalbruch zugeordnet werden und jeder solche Dezimalbruch ist entweder abbrechend (0.25) oder hat eine Periodenlänge. Beispiel
\frac{1}{11}=0.090909...=0.\overline{09} hat Periodenlänge zwei.
Schreiben Sie nun ein Programm, das eine natürliche Zahl erfragt und davon angibt, wie lange die Periodenlänge des zugehörigen Dezimalbruches ist. Bricht der Dezimalbruch ab, so definieren wir die Periodenlänge 0.
Tipp: Verwenden Sie z. B. die Methode der schriftlichen Division aus der Primarschule.
0 Kommentare
4 Lösung(en)
// NET Core 3.x
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace CS_MDL_CORE_Periodenlaenge
{
class Program
{
static void Main(string[] args)
{
for (var i = 1; i < 14; i++)
Console.WriteLine($"{i:00} -> {GetLength(i)}");
}
static int GetLength(int n) => new Regex(@"(\d{2,}).*\1").Match((1.0 / n).ToString()).ToString().ToCharArray().Distinct().Count();
}
}
Lösung von: Jens Kelm (@JKooP)
def length(a, b):
stack = []
while True:
while a < b:
a *= 10
stack.append(a)
a = 10 * (a % b)
if a == 0:
return 0
if a in stack:
return len(stack) - stack.index(a)
stack.append(a)
for i in range(1, 101):
print("1/{}: {}".format(i, length(1, i)))
Lösung von: Name nicht veröffentlicht
// C++ 11
/*
Ich habe die hervorragende, "namenlose" Python-Lösung aufgegriffen
und in eine C++ - Version verwandelt.
Die Eigenleistung bestand lediglich in der Umformulierung.
*/
#include <iostream>
#include <vector>
using namespace std;
int get_length(int n, int d)
{
vector<int> v;
while (true)
{
while (n < d) v.push_back(n *= 10);
n = 10 * (n % d);
if (n == 0) return 0;
if (find(v.begin(), v.end(), n) != v.end())
return (size(v) - (find(v.begin(), v.end(), n) - v.begin()));
v.push_back(n);
}
}
int main()
{
for (size_t i = 1; i <= 100; i++)
cout << "1/" << i << " => " << get_length(1, i) << endl;;
}
Lösung von: Jens Kelm (@JKooP)
/*
| Siehe hierzu den sehr aufschlussreichen artikel von Arndt Brünner:
| https://www.arndt-bruenner.de/mathe/scripts/periodenlaenge.htm
*/
function unitFracPeriodicLength(num) {
let n = 1, modulo = 10;
while (num % 2 == 0) num /= 2;
while (num % 5 == 0) num /= 5;
if (num == 1) return 0;
for (n; /* */; n++) {
modulo %= num;
if (modulo == 1) break;
modulo *= 10;
}
return n;
}
// ausgabe
for (let i = 1; i <= 20; i++)
console.log(`${i} -> ${unitFracPeriodicLength(i)}`);
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
Verifikation/Checksumme:
1→0
2→0
3→1
4→0
5→0
6→1
7→6
8→0
9→1
10→0
11→2
12→1
13→6
...
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 0.5 |
Schwierigkeit: | Mittel |
Webcode: | jeyr-p6jg |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |