Siema :)
Kontynuuję swoją przygodę z funkcjami i mam przed sobą takie o to zadanie:
"
Napisz program, który wczyta od użytkownika macierz o wymiarze 5x5. Program ma odnaleźć we wczytanej macierzy wszystkie pary liczb pierwszych sąsiadujące ze sobą. W skrajnych przypadkach liczba ma trzech sąsiadów (jeśli jest narożnikiem macierzy wejściowej), pięciu sąsiadów (jeśli jest na krawędzi) lub ośmiu sąsiadów (jeśli jest w środku). Program ma zwrócić liczbę znalezionych takich par, a następnie w oddzielnych liniach ich współrzędne (w postaci numer wiersza, numer kolumny pierwszej liczby i numer wiersza numer kolumny drugiej liczby). Do sprawdzenia czy liczba jest pierwsza wykorzystaj funkcję z zadania 8.11 Liczby pierwsze w przedziale. w przypadku wprowadzenia przez użytkownika błędnych danych program powinien wyświetlić komunikat Incorrect input i niezwłocznie zakończyć działanie z kodem błędu 1.
Przykładowe wejście:
podaj liczby:
4 15 -4 20 -2
14 15 18 5 7
18 10 18 18 12
18 11 4 18 -1
10 10 5 11 5
Przykładowe wyjście:
4
4 3 4 4
4 2 4 3
3 1 4 2
1 3 1 4
Z początku wydawało się mi to banalne. Napisałem parę dni temu z funkcjami programy na liczby pierwsze, a następnie bliźniacze, więc sądziłem, że i z tym pójdzie mi szybko. No to nie mogłem się pomylić bardziej...
Generalnie mój problem jest taki, że postanowiłem to zrobić chyba najbardziej topornie jak się da (sami zobaczcie):
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int is_prime(int a);
int main(int argc, char *argv[])
{
int kontrola=0;
int a;
int b,c,d,e,f,g,h,o;
int i;
int j;
int zm_i;
int zm_j;
int tab[5][5]={0};
printf("Podaj liczby:\n");
for(i=0;i<=4;i++)
{
for(j=0;j<=4;j++)
{
if(scanf("%d",&tab[i][j])!=1)
{
printf("Incorrect input");
}
}
}
for(i=0;i<=4;i++)
{
for(j=0;j<=4;j++)
{
a=tab[i][j];
if(is_prime(a)==1)
{
if(i==0 && j==0)
{
c=tab[i+1][j];
d=tab[i+1][j+1];
if(is_prime(c)==1 || is_prime(d)==1)
{
kontrola++;
}
}
else if(i==4 && j==0)
{
b=tab[i-1][j];
d=tab[i-1][j+1];
if(is_prime(b)==1 || is_prime(d)==1)
{
kontrola++;
}
}
else if(i==0 && j==4)
{
b=tab[i+1][j];
d=tab[i+1][j-1];
if(is_prime(b)==1 || is_prime(d)==1)
{
kontrola++;
}
}
else if(i==4 && j==4)
{
b=tab[i-1][j-1];
c=tab[i-1][j];
if(is_prime(b)==1 || is_prime(c)==1)
{
kontrola++;
}
}
else if((i==0 && j==1) || (i==0 && j==2) || (i==0 && j==3))
{
b=tab[i][j-1];
c=tab[i][j+1];
d=tab[i+1][j];
e=tab[i+1][j-1];
f=tab[i+1][j+1];
if(is_prime(b)==1 || is_prime(c)==1 || is_prime(d)==1 || is_prime(e)==1 || is_prime(f)==1)
{
kontrola++;
}
}
else if((i==4 && j==1) || (i==4 && j==2) || (i==4 && j==3))
{
b=tab[i][j-1];
c=tab[i][j+1];
d=tab[i-1][j];
e=tab[i-1][j-1];
f=tab[i-1][j+1];
if(is_prime(b)==1 || is_prime(c)==1 || is_prime(d)==1 || is_prime(e)==1 || is_prime(f)==1)
{
kontrola++;
}
}
else if(is_prime(a)==1 && (i==1 && (j==1 || j==2 || j==3)) || (i==2 && (j==1 || j==2 || j==3) || (i==3 && (j==1 || j==2 || j==3) ) ) )
{
b=tab[i][j+1];
c=tab[i][j-1];
d=tab[i+1][j-1];
e=tab[i+1][j+1];
f=tab[i-1][j-1];
g=tab[i-1][j+1];
o=tab[i+1][j];
h=tab[i-1][j];
if(is_prime(b)==1 || is_prime(c)==1 || is_prime(d)==1 || is_prime(e)==1 || is_prime(f)==1 || is_prime(g)==1 || is_prime(o)==1 || is_prime(h)==1 )
{
kontrola++;
}
}
}
}
}
if(kontrola==0)
{
printf("Nothing to show");
return 0;
}
printf("%d\n",kontrola);
for(i=0;i<=4;i++)
{
for(j=0;j<=4;j++)
{
a=tab[i][j];
if(is_prime(a)==1)
{
if(i==0 && j==0)
{
c=tab[i+1][j];
d=tab[i+1][j+1];
if(is_prime(c)==1)
{
printf("%d %d %d %d\n",i,j,i+1,j);
}
if(is_prime(d)==1)
{
printf("%d %d %d %d\n",i,j,i+1,j+1);
}
}
else if(i==4 && j==0)
{
b=tab[i-1][j];
d=tab[i-1][j+1];
if(is_prime(b)==1)
{
printf("%d %d %d %d\n",i,j,i-1,j);
}
if(is_prime(d)==1)
{
printf("%d %d %d %d\n",i,j,i-1,j+1);
}
}
else if(i==0 && j==4)
{
b=tab[i+1][j];
d=tab[i+1][j-1];
if(is_prime(b)==1)
{
printf("%d %d %d %d\n",i,j,i+1,j);
}
if(is_prime(d)==1)
{
printf("%d %d %d %d\n",i,j,i+1,j-1);
}
}
else if(i==4 && j==4)
{
b=tab[i-1][j-1];
c=tab[i-1][j];
if(is_prime(b)==1)
{
printf("%d %d %d %d\n",i,j,i-1,j-1);
}
if(is_prime(c)==1)
{
printf("%d %d %d %d\n",i,j,i-1,j);
}
}
else if((i==0 && j==1) || (i==0 && j==2) || (i==0 && j==3))
{
b=tab[i][j-1];
c=tab[i][j+1];
d=tab[i+1][j];
e=tab[i+1][j-1];
f=tab[i+1][j+1];
if(is_prime(b)==1)
{
printf("%d %d %d %d\n",i,j,i,j-1);
}
if(is_prime(c)==1)
{
printf("%d %d %d %d\n",i,j,i,j+1);
}
if(is_prime(d)==1)
{
printf("%d %d %d %d\n",i,j,i+1,j);
}
if(is_prime(e)==1)
{
printf("%d %d %d %d\n",i,j,i+1,j-1);
}
if(is_prime(f)==1)
{
printf("%d %d %d %d\n",i,j,i+1,j+1);
}
}
else if((i==4 && j==1) || (i==4 && j==2) || (i==4 && j==3))
{
b=tab[i][j-1];
c=tab[i][j+1];
d=tab[i-1][j];
e=tab[i-1][j-1];
f=tab[i-1][j+1];
if(is_prime(b)==1)
{
printf("%d %d %d %d\n",i,j,i,j-1);
}
if(is_prime(c)==1)
{
printf("%d %d %d %d\n",i,j,i,j+1);
}
if(is_prime(d)==1)
{
printf("%d %d %d %d\n",i,j,i-1,j);
}
if(is_prime(e)==1)
{
printf("%d %d %d %d\n",i,j,i-1,j-1);
}
if(is_prime(f)==1)
{
printf("%d %d %d %d\n",i,j,i-1,j+1);
}
}
else if(is_prime(a)==1 && (i==1 && (j==1 || j==2 || j==3)) || (i==2 && (j==1 || j==2 || j==3) || (i==3 && (j==1 || j==2 || j==3) ) ) )
{
b=tab[i][j+1];
c=tab[i][j-1];
d=tab[i+1][j-1];
e=tab[i+1][j+1];
f=tab[i-1][j-1];
g=tab[i-1][j+1];
o=tab[i+1][j];
h=tab[i-1][j];
if(is_prime(b)==1 || is_prime(c)==1 || is_prime(d)==1 || is_prime(e)==1 || is_prime(f)==1 || is_prime(g)==1 || is_prime(o)==1 || is_prime(h)==1 )
{
}
}
}
}
}
}
int is_prime(int a)
{
int s;
int kontrola=0;
for(s=a;s>=1;s--)
{
if(a%s == 0)
{
kontrola++;
}
if(s==1 && kontrola==2)
{
return 1;
}
}
return 0;
}
Nie mam już sił tego dalej ropzisywać. I tak jest już źle, bo nie uwzględniłem, że tylko dla środkowych elementów powinienem szukać 7 sąsiadów, dla krawędzi 2, a dla narożników jednego. Czy muszę to zadanie rozwiązywać jeszcze raz tak jak to opisałem w poprzednim zdaniu, czy można to zrobić prościej? :/
P.S Na pewno musi być prostszy sposób, zadania na liczby bliźniacze i pierwsze były warte tyle samo punktów i zrobiłem je w mniej niż 100 linijkach. :/
P.S 2 Okej, zrobiłem to zadanie i zostało mi zaliczone, ale złożoność obliczeniowa jest tak wielka, że mnie to aż przeraża.
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int is_prime(int a);
int main(int argc, char *argv[])
{
int kontrola=0;
int a;
int b,c;
int i;
int j;
int tab[5][5]={0};
printf("Podaj liczby:\n");
for(i=0;i<=4;i++)
{
for(j=0;j<=4;j++)
{
if(scanf("%d",&tab[i][j])!=1)
{
printf("Incorrect input");
return 1;
}
}
}
for(i=0;i<=4;i++)
{
for(j=0;j<=3;j++)
{
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i][j+1];
if(is_prime(b)==1)
{
kontrola++;
}
}
}
}
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
{
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i+1][j];
if(is_prime(b)==1)
{
kontrola++;
}
}
}
}
for(i=0;i<=3;i++)
{
for(j=1;j<=3;j++)
{
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i+1][j-1];
c=tab[i+1][j+1];
if(is_prime(b)==1)
{
kontrola++;
}
if(is_prime(c)==1)
{
kontrola++;
}
}
}
}
for(i=0;i<=3;i++)
{
j=0;
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i+1][1];
if(is_prime(b)==1)
{
kontrola++;
}
}
}
for(i=0;i<=3;i++)
{
j=4;
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i+1][3];
if(is_prime(b)==1)
{
kontrola++;
}
}
}
printf("%d\n",kontrola);
for(i=0;i<=4;i++)
{
for(j=0;j<=3;j++)
{
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i][j+1];
if(is_prime(b)==1)
{
printf("%d %d %d %d\n",i,j,i,j+1);
}
}
}
}
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
{
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i+1][j];
if(is_prime(b)==1)
{
printf("%d %d %d %d\n",i,j,i+1,j);
}
}
}
}
for(i=0;i<=3;i++)
{
for(j=1;j<=3;j++)
{
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i+1][j-1];
c=tab[i+1][j+1];
if(is_prime(b)==1 )
{
printf("%d %d %d %d\n",i,j,i+1,j-1);
}
if(is_prime(c)==1)
{
printf("%d %d %d %d\n",i,j,i+1,j+1);
}
}
}
}
for(i=0;i<=3;i++)
{
j=0;
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i+1][1];
if(is_prime(b)==1)
{
printf("%d %d %d %d\n",i,0,i+1,1);
}
}
}
for(i=0;i<=3;i++)
{
j=4;
a=tab[i][j];
if(is_prime(a)==1)
{
b=tab[i+1][3];
if(is_prime(b)==1)
{
printf("%d %d %d %d\n",i,4,i+1,3);
}
}
}
}
int is_prime(int a)
{
int s;
int kontrola=0;
for(s=a;s>=1;s--)
{
if(a%s == 0)
{
kontrola++;
}
if(s==1 && kontrola==2)
{
return 1;
}
}
return 0;
}