Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

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

Bitte melde dich an um einen Kommentar abzugeben

3 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)

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

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 0.5
Schwierigkeit: Mittel
Webcode: jeyr-p6jg
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen