C# :: Aufgabe #367

3 Lösungen Lösungen öffentlich

Palindromische Primzahlen

Anfänger - C# von hollst - 29.03.2021 um 21:12 Uhr
Man erzeuge eine Liste aller Primzahle <= 1 Milliarde (1E+9), die in dezimaler Präsentation umgekehrt gelesen ebenfalls eine Primzahl sind (Palindromische Primzahlen). Z. B. 13; 31 ist ebenfalls Primzahl.

Viel Spaß!

Lösungen:

1 Kommentar
1x
vote_ok
von JKooP (11680 Punkte) - 31.03.2021 um 09:51 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;

GetPrimeList(1000).ForEach(x => Console.WriteLine(x));

static List<(int prime, int primeRev)> GetPrimeList(int max)
{
    List<(int, int)> lst = new();
    for (int i = 10; i <= max; i++)
    {
        if (IsPrime(i))
        {
            var pr = GetRevNum(i);
            if (IsPrime(pr))
                lst.Add((i, pr));
        }
    }
    return lst;
}

static bool IsPrime(int n) => n > 1 && Enumerable.Range(1, n).Where(x => n % x == 0).SequenceEqual(new[] { 1, n });

static int GetRevNum(int num)
{
    var rev = 0;
    while (num != 0)
    {
        rev *= 10;
        rev += (num % 10);
        num /= 10;
    }
    return rev;
}
vote_ok
von hollst (13340 Punkte) - 31.03.2021 um 16:47 Uhr
Quellcode ausblenden C#-Code
using static System.Console;
using System.Collections.Generic;

int n = (int)1e+9;
WriteLine($"Palindromische Primzahlen bis {n.ToString("n0")}:");

bool[] b = Primes_Until(n);
int counter = 0;
for (var i = 2; i < b.Length; i++)
    if (!b[i] && !b[InversInt(i)])
            WriteLine($"{(++counter).ToString("n0"), 10}: {i.ToString("n0"), 12}");
WriteLine($"fertig: insgesamt {counter.ToString("n0")} Palindromische Primzahlen bis {n.ToString("n0")}");
ReadKey();

#region methods
static bool[] Primes_Until(int n)  {
    bool[] b = new bool[n + 1];
    for (var i = 4; i <= n; i += 2)
        b[i] = true;
    for (var i = 3; i <= n; i += 2)
        if (!b[i])
            for (var j = i + i; j <= n; j += i)
                b[j] = true;
    return b;
}

static int InversInt(int i)  {
    List<int> digits = new();
    while (i > 0)  {
        digits.Add(i % 10);
        i /= 10;
    }
    int pot = 1, result = 0;
    for (var j = digits.Count - 1; j >= 0; j--)  {
        result += pot * digits[j];
        pot *= 10;
    }
    return result;
}
#endregion
1 Kommentar
1x
vote_ok
von Waldgeist (2270 Punkte) - 31.03.2021 um 20:16 Uhr
Hallo,

ich habe mich bei meiner Lösung an die Wikipedia Vorgaben gehalten. Das heißt 13 bzw. 31 ist kein Palindrom!
Da mein kleiner Laptop nicht so schnell ist habe ich als Ziel nur 100.000 eingegeben.

Hier der Code:

Quellcode ausblenden C#-Code
using System;

namespace _367_Palindrome_Primzahlen
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Dieses Progremm ermittelt Palidromische Primzahlen");

            uint berechneBisZahl = 100000;
            

            for (uint i = 2; i <= berechneBisZahl; i++)
            {
                if (IstPrimzahl(i))
                {
                    if (istPalindrom(i))
                    {
                        Console.WriteLine(i);
                    }
                }
            }

            bool IstPrimzahl(uint zuprüfendeZahl)
            {
                for (uint i = 2; i < zuprüfendeZahl; i++)
                {
                    if (zuprüfendeZahl % i == 0)
                    {
                        return false;
                    }
                }
                return true;
            }

            bool istPalindrom(uint zuprüfendePrimzahl)
            {
                string zahl = zuprüfendePrimzahl.ToString();
                char[] c = zahl.ToCharArray();

                string zahlrückwerts = "";

                for (int i = (zahl.Length - 1); i >= 0; i--)
                {
                    zahlrückwerts = zahlrückwerts + c[i];
                }

                if (zuprüfendePrimzahl == Convert.ToUInt32(zahlrückwerts))
                {
                    return true;
                }
                return false;
            }
        }
    }
}