Informatică, întrebare adresată de ionutg38, 9 ani în urmă

Unde e gresala in acest program?
#include
using namespace std;
ifstream in("memory004.in");
ofstream out("memory004.out");
const int N=1101;
int m,n,a;
int LSNPIC[N]; // LMSC=Lungime Secventa Numere Prime Inceput Coloana;
int LSNPSC[N]; // LMSC=Lungime Secventa Numere Prime Sfarsit Coloana;
int LI[N]; // LI=1 sau 0 (1 daca am calculat deja lungimea de inceput de coloana)
bool prim[10001]; // Ciurul lui Eratostene

int main()
{
prim[0]=prim[1]=1; // 0 si 1 nu-s prime
for(int i=2;i*i<=10000; ++i)
if(prim[i]==0)
for(int j=2;i*j<=10001;++j)
prim[i*j]=1; // Sunt marcate cu 0 cele prime si cu 1 cele ce nu-s prime
/*
La citirea elementelor matricei se afla secventele de numere prime pe fiecare coloana,
retinand maximul lungimilor acestora.
De asemenea, se retin intr-un sir lungimile secventelor de numere prime de la inceputul fiecarei coloane.
Aceste lungimi se vor aduna cu lungimile secventelor de la sfarsitul coloanei precedente fiecarei coloane,
sumele obtinute fiind de asemenea comparate cu maximul.
*/
in>>m>>n; // Citim dimensiunile matricii
for(int i=0;i for(int j=0;j {
in>>a;
if(!prim[a]&&LI[j]==0) // Memorez lungimea la inceputul coloanei
LSNPIC[j]++;
else
LI[j]=1;

if(!prim[a]) // Memorez lungimea la sfarsitul coloanei
LSNPSC[j]++;
else
LSNPSC[j]=0;
}
int L=LSNPSC[0],LMAX=0; // L=lungimea unei secvente, LMAX=lungimea maxima a secventei de nr. prime
for(int j=1;j<=n;j++)
{
L+=LSNPIC[j];
if(L>LMAX&&LSNPIC[j]!=m)
LMAX=L,L=LSNPSC[j];
}
if(L>LMAX)
LMAX=L;
out< return 0;
}
E vornba de problema #1495 Memory004 de pe pbinfo.ro care are urmatorul enunt:
Se dă o matrice cu m linii şi n coloane, având elementele numere naturale nenule. Parcurgând matricea pe coloane de sus în jos şi de la stânga la dreapta, determinaţi lungimea maximă a unei secvenţe de numere prime.

Date de intrare
Fișierul de intrare memory004.in conține pe prima linie numerele m şi n, iar pe următoarele m linii câte n numere naturale, separate prin spații, reprezentând elementele matricei.

Date de ieșire
Fișierul de ieșire memory004.out va conține pe prima linie numărul L, reprezentând lungimea maximă a unei secvenţe de numere prime din matrice obţinută prin parcurgerea matricei pe coloane, de sus în jos şi de la stânga la dreapta.

Restricții și precizări
2 ≤ m , n ≤ 1000
elementele matricei sunt numere naturale mai mici decât 10.000



Exemplu
memory004.in

3 4
1 6 5 11
2 4 3 9
2 4 7 8
memory004.out

4
Explicație
Se dă o matrice cu 3 linii şi 4 coloane. Parcurgând matricea pe coloane de sus în jos şi de la stânga la dreapta se obţin secvenţele de numere prime, puse în evidenţă cu ajutorul culorilor, în matricea de mai jos:
1 6 5 11
2 4 3 9
2 4 7 8
Secvenţele de numere prime sunt 2,2 şi 5,3,7,11, lungimea maximă fiind 4.


alexandrastan93: Nu e #include<iostream>?
ionutg38: Ba da, dar nu a luat aici la copiere. e #include <fstream>
ionutg38: obtin 50 puncte din 100 cu el asa, dar nu merge pe jumatatedun teste
alexandrastan93: Aaaa,ok;))

Răspunsuri la întrebare

Răspuns de Gillga
4
consider ca te complici prea mult incercand sa nu folosesti matrice, cel mai bibe ar fii sa-o construiesti, poti sa folosesti chiar boolean pentru a crea una ce utilizeaza mai putina memorie.
Construiesti matricea si pui 1 la cele prime, 0 la celelaltr; apoi o reparcurgi , insa de data aceasta mergi pe coloane si iei sirul care-l gasesti cel mai lung.


CODUL(pentru citit si cautat sirul cel mai lung):
in >>n>>m;
bool matrice [1000][1000];
for (int i=0;i <m;i++)
for (int j=0;j <n;j++)
{
in>>a;
if (!prim [a])
matricr [i][j] = 1;
else
matrice[i][j] = 0 ;

}

int max=0,numara=0;

for (int j=0;j <n;j++)
for (int i=0;i <m;i++)
{
if (matrice [i][j] == 1)
numara++;
else
numara =0;

if (numara >max)
max = numara;
}

out << max;



Sper ca te ajuta, daca ai intrebari, nu ezita sa intrebi; bafta. :)

ionutg38: E vorba de problema Memory004 de pe pbinfo.ro si are urmatoarele indicatii de rezolvare:
ionutg38: Indicații de rezolvare


La citirea elementelor matricei se află secvenţele de numere prime pe fiecare coloană, reţinând maximul lungimilor acestora. De asemenea, se reţin într-un şir lungimile secvenţelor de numere prime de la începutul fiecărei coloane. Aceste lungimi se vor aduna cu lungimile secvenţelor de la sfârşitul coloanei precedente fiecărei coloane, sumele obţinute fiind de asemenea comparate cu maximul.
ionutg38: E vorba si de o utilizare eficienta a memoriei.
Gillga: am gasit o modalitate de a-l rezolva fara matrice, din punctul de vedere a memoriei , utilizeaza de 10 ori mai putin, dar nu stiu unde sa postez raspunsul, deoarece nu ma lasa a edita raspunsul dat de mine anterior, daca stii o modalitate, te-as ruga a ma informa; in cazul in care ai rezolvat problema nu consider ca solutia mea sa mai fie necesara, oricum las la atitudinea ta .
ionutg38: Multumesc, am rezolvat problema. Daca vrei solutia, ti-o pot trimite. Ti-as da adresa de e-mail dar nu stiu daca am voie aici.
Gillga: nu e nevoie, multumesc oricum ^-^y
ionutg38: Cu placere
Alte întrebări interesante