Buna,am facut problema aceasta,imi da in codeblocks si pe pbinfo imi da doar 20 puncte. De ce?
Problema;
Se consideră un tablou bidimensional cu n linii şi n coloane ce conţine numere naturale cu cel mult două cifre fiecare.
Cerinţa
Să se determine ultima cifră a produsului elementelor de pe diagonala secundară cu proprietatea că sunt minime pe coloanele lor.
Date de intrare
Fişierul de intrare mincols1.in conţine pe prima linie numărul n, iar pe următoarele n linii câte n numere naturale separate prin spaţii, reprezentând elementele tabloului.
Date de ieşire
Fişierul de ieşire mincols1.out va conţine pe prima linie un singur număr, reprezentând valoarea cerută.
Restricţii şi precizări
2 ≤ n ≤ 30
dacă în matrice nu există asemenea elemente, se va afișa mesajul NU EXISTA
Cod:
#include
using namespace std;
ifstream fin("mincols1.in");
ofstream fout("mincols1.out");
int n,i,j,a[33][33],minim,p=1,ok;
int main()
{
fin >> n;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
fin >> a[i][j];
for(i=1; i<=n; i++)
{
minim=a[i][1];
for(j=1; j<=n; j++)
if((a[i][j]
{
minim=a[i][j];
p=p*a[i][j];
}
}
fout << p%10;
return 0;
}
Răspunsuri la întrebare
Răspuns de
7
Tu trebuia sa calculezi minimul de pe fiecare coloana, mai intai, si apoi sa verifici daca se afla pe diagonala secundara (conditie determinata de formula
i + j = n + 1).
In primul rand, tu ai calculat minimul de pe fiecare linie, nu coloana. Ca sa faci asta, puteai sa inversezi cele 2 functii for, astfel aveai for(j = 1...) {for(i = 1...)} .
A doua metoda era sa accesezi elementele matricei cu a[j][i], nu a[i][j].
In al doilea rand, tu ai facut inmultirea ("p=p*a[i][j]") atunci cand ai gasit un nou minim, dar trebuia s-o faci de-abea dupa ce calculai minimul si verificai daca sa afla pe diagonala pincipala.
Codul:
#include <fstream>
using namespace std;
ifstream fin("mincols1.in");
ofstream fout("mincols1.out");
int n, i, j, a[33][33], minim, p = 1, ok;
int main()
{
fin>>n;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
fin>>a[i][j];
for(i = 1; i <= n; i++)
{
minim = a[1][i]; //primul element de pe COLOANA
for(j = 1; j <= n; j++)
if(a[j][i] < minim) //aici am pus a[j][i] in loc de a[i][j]
minim = a[j][i];
if(minim == a[n - i + 1][i]) //Verificam daca minimul este cel de pe diagonala //secundara; Din formula i + j = n + 1
// l-am aflat pe j = n - i + 1
p = (p * minim) % 10; //De-abea acum facem inmultirea
}
fout<<p;
}
i + j = n + 1).
In primul rand, tu ai calculat minimul de pe fiecare linie, nu coloana. Ca sa faci asta, puteai sa inversezi cele 2 functii for, astfel aveai for(j = 1...) {for(i = 1...)} .
A doua metoda era sa accesezi elementele matricei cu a[j][i], nu a[i][j].
In al doilea rand, tu ai facut inmultirea ("p=p*a[i][j]") atunci cand ai gasit un nou minim, dar trebuia s-o faci de-abea dupa ce calculai minimul si verificai daca sa afla pe diagonala pincipala.
Codul:
#include <fstream>
using namespace std;
ifstream fin("mincols1.in");
ofstream fout("mincols1.out");
int n, i, j, a[33][33], minim, p = 1, ok;
int main()
{
fin>>n;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
fin>>a[i][j];
for(i = 1; i <= n; i++)
{
minim = a[1][i]; //primul element de pe COLOANA
for(j = 1; j <= n; j++)
if(a[j][i] < minim) //aici am pus a[j][i] in loc de a[i][j]
minim = a[j][i];
if(minim == a[n - i + 1][i]) //Verificam daca minimul este cel de pe diagonala //secundara; Din formula i + j = n + 1
// l-am aflat pe j = n - i + 1
p = (p * minim) % 10; //De-abea acum facem inmultirea
}
fout<<p;
}
diacriss2001:
Multumesc
Alte întrebări interesante
Matematică,
8 ani în urmă
Fizică,
8 ani în urmă
Matematică,
8 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă