Ile liczb pierwszych można stworzyć z podanej liczby?

0

Siema mam pytanie, ale najpierw podam treść zadania które rozwiązuję:

Napisać program znajdujący wszystkie liczby pierwsze, które można stworzyć z cyfr podanej liczby całkowitej. Np. z cyfr
liczby 1379 można stworzyć 31 liczb pierwszych. Uwaga: budując liczbę pierwszą każdą cyfrę można użyć tylko raz. Obsłużyć
wyjątki.

Stworzyłem kod, który wypisuje ilość liczb pierwszych, dla liczby o długości co najwyżej 4, po prostu stworzyłem 4 pętle w pętli, dla liczby 3 cyfrowej są to 3 pętle w pętli itd.

Nie mam niestety pomysłu jak ten przypadek uogólnić za pomocą metody, żeby dla liczby np. 30 cyfrowej nie pisać 30 pętli.
Byłbym wdzięczny za jakąkolwiek pomoc :)

Oto kod:

using System;

namespace Zad._18
{
    class Program
    {

       private static Boolean czyPierwsza(int liczba)
        {
            if (liczba == 1)
                return false;

             for(int i = 2; i <= Math.Sqrt(liczba); i++)
             {
                if (liczba % i == 0)
                    return false;
             }
             return true;
        }

        static void Main(string[] args)
        {
            int liczbyPierwsze = 0;

            String wprowadzona;
            String[] cyfry;

            Console.WriteLine("Wprowadź liczbę: ");
            wprowadzona = Console.ReadLine();

            cyfry = new string[wprowadzona.Length];

            for(int i = 0; i < wprowadzona.Length; i++)
            {
                cyfry[i] = wprowadzona.Substring(i, 1);
            }

            int liczba;

            Console.Write("\nZ liczby {0}, można stworzyć ", wprowadzona);

            while (true)
            {
                for (int i = 0; i < cyfry.Length; i++)
                {
                 if(Int32.TryParse((cyfry[i]), out liczba))   {
                    if (czyPierwsza(liczba))
                        liczbyPierwsze++;
                    }
                }

                if (wprowadzona.Length == 1)
                    break;

                for (int i = 0; i < cyfry.Length; i++)
                {
                    for (int j = 0; j < cyfry.Length; j++)
                    {
                        if (i == j)
                            continue;

                        if (Int32.TryParse(cyfry[i] + cyfry[j], out liczba))
                        {
                            if (czyPierwsza(liczba))
                                liczbyPierwsze++;
                        }
                    }
                }

                if (wprowadzona.Length == 2)
                    break;

                for (int i = 0; i < cyfry.Length; i++)
                {
                    for (int j = 0; j < cyfry.Length; j++)
                    {
                        for (int k = 0; k < cyfry.Length; k++)
                        {
                            if (i == j || i == k || j == k)
                                continue;

                            if (Int32.TryParse(cyfry[i] + cyfry[j] + cyfry[k], out liczba))
                            {
                                if (czyPierwsza(liczba))
                                    liczbyPierwsze++;
                            }
                        }
                    }
                }

                if (wprowadzona.Length == 3)
                    break;

                for (int i = 0; i < cyfry.Length; i++)
                {
                    for (int j = 0; j < cyfry.Length; j++)
                    {
                        for (int k = 0; k < cyfry.Length; k++)
                        {
                            for (int l = 0; l < cyfry.Length; l++)
                            {
                                if (i == j || i == k || i == l || j == k || j == l || k == l)
                                    continue;

                                if (Int32.TryParse(cyfry[i] + cyfry[j] + cyfry[k] + cyfry[l], out liczba))
                                {
                                    if (czyPierwsza(liczba))
                                        liczbyPierwsze++;
                                }
                            }
                        }
                    }
                }
                break;
            }

            Console.WriteLine(liczbyPierwsze.ToString() + " liczb pierwszych.");

            Console.ReadKey();
        }
    }
}


1

Widzę to tak: Znajdź algorytm na kombinacje, potem dla każdej kombinacji szukaj jej permutacji i te Testuj na pierwszosc. Wcześniej liczbę Zmień na wektor lub stringa.
Kombinacje:
https://stackoverflow.com/questions/7802822/all-possible-combinations-of-a-list-of-values
Permutacje:
https://stackoverflow.com/questions/5128615/c-sharp-string-permutation
EDIT: acha, wczesniej Usuń duplikaty, np., przekształcając na zbiór.

1 użytkowników online, w tym zalogowanych: 0, gości: 1