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();
}
}
}