C# :: Aufgabe #381

2 Lösungen Lösungen öffentlich

Binärzahlen ohne zwei aufeinanderfolgende Nullen

Anfänger - C# von hollst - 09.11.2020 um 15:10 Uhr
Erstelle eine Liste der ersten 1.000 Natürlichen Zahlen, die in ihrer binären Darstellung keine zwei aufeinanderfolgende Nullen haben.

Kleine Unterstützung zur Prüfung: Die ersten 10 Zahlen der Liste sind: 0, 1, 2, 3, 5, 6, 7, 10, 11 und 13. Das 1.000ste (letzte) Element der Liste ist 10.965.

Viel Spaß!

Lösungen:

vote_ok
von JKooP (18090 Punkte) - 15.04.2021 um 19:30 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden C#-Code
using System;
using System.Linq;
using System.Text.RegularExpressions;

Enumerable.Range(1, 10_000).Where(x => !IsDoubleZero(I2B(x))).ToList().ForEach(x => Console.WriteLine($"{x} - {I2B(x)}"));
string I2B(int n) => Convert.ToString(n, 2);
bool IsDoubleZero(string s) => Regex.Matches(s, "(0)\\1*").Any(x => x.Length > 1);
vote_ok
von JKooP (18090 Punkte) - 06.06.2021 um 18:56 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Text;

Console.WriteLine(new BinaryWithoutDoubleZero(1, 10_000));

record BinaryWithoutDoubleZero(uint Start = 1, uint End = 100)
{
    private readonly Dictionary<uint, string> _dic = new();

    private static string ToBinary(uint n) => Convert.ToString(n, 2);

    private static bool IsDoubleZero(string s)
    {
        var z = 0;
        foreach (var i in s)
        {
            if (i == '0') z++;
            else z = 0;
            if (z == 2) return true;
        }
        return false;
    }

    private void SetNumbers()
    {
        for (uint i = Start; i < End; i++)
        {
            var b = ToBinary(i);
            if (!IsDoubleZero(b))
                _dic.Add(i, b);
        }
    }

    public override string ToString()
    {
        StringBuilder sb = new();
        SetNumbers();

        foreach (var i in _dic)
            sb.Append($"{i.Key} : {i.Value}\n");
        return sb.ToString();
    }
}