Wiesław Temat założony przez niniejszego użytkownika |
[C++] Największa przekątna tablicy dwuwymiarowej » 2017-12-09 14:14:54 Witam, ostatnio napisałem program, który wypisuje numer i elementy lewoskośnej przekątnej tablicy dwuwymiarowej o największej sumie liczb. Nie działa mi on jednak poprawnie z samymi liczbami ujemnymi. Może ktoś znaleźć błąd? PS. Zależy mi,żeby przekątne numerować od 1. #include<iostream> using namespace std; int main() { int n; cin >> n; int tab[ n ][ n ]; for( int a = 0; a < n; a++ ) { for( int b = 0; b < n; b++ ) cin >> tab[ a ][ b ]; } int z = 1, suma = 0, w = 0; for( int i = 0; i <( 2 * n ) - 1; i++ ) { for( int x = 0; x < n; x++ ) { suma = 0; for( int y = 0; y < n; y++ ) { if( x + y == i ) suma += tab[ x ][ y ]; } if( suma > w ) { w = suma; z = i + 1; } } } cout << z << ": "; for( int x = 0; x < n; x++ ) { for( int y = 0; y < n; y++ ) { if( x + y == z - 1 ) cout << tab[ x ][ y ] << " "; } } return 0; }
|
|
nanoant20 |
» 2017-12-14 19:53:55 Oczywiście, że mogę znaleźć błąd Niebezpieczna konstrukcjaint n; cin >> n; int tab[ n ][ n ];
Rozmiar tablicy ustawia się na sztywno, liczba elementow musi być wartością stałą, albo za pomocą operatora newhttp://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Tablice-jednowymiarowe/292korzystaj, też ze strumienia wyjściowego cout, w celu kontroli co robi program |
|
darko202 |
» 2017-12-15 10:44:32 a poza tym 1. >> Nie działa mi on jednak poprawnie z samymi liczbami ujemnymi. int z = 1, suma = 0, w = 0;
suma += tab[ x ][ y ];
if( suma > w )
int z = 1, suma = 0, w = 0;
for( int i = 0; i <( 2 * n ) - 1; i++ ) { for( int x = 0; x < n; x++ ) { suma = 0; for( int y = 0; y < n; y++ ) { if( x + y == i ) suma += tab[ x ][ y ]; } if( suma > w ) { w = suma; z = i + 1; } } }
2. >> program, który wypisuje numer i elementy lewoskośnej przekątnej tablicy dwuwymiarowej for( int i = 0; i <( 2 * n ) - 1; i++ ) { suma = 0; for( int x = 0; x < n; x++ ) { for( int y = 0; y < n; y++ ) ...
|
|
Wiesław Temat założony przez niniejszego użytkownika |
» 2017-12-17 12:49:43 Dziękuję za pomoc. Sam napisałem taki poprawiony kod, w którym tablica ma wymiary 3x3. Zmieniłem miejsce zerowania sumy oraz w, jednak ciągle coś nie działa (jest to kwestia dosłownie jednego miejsca w tablicy). Wymiary tablicy dla których kod nie działa to -1 -1 -1 -1 -1 -1 -1 -1 0 Wypisuje wtedy 4: -1 -1, a nie 5: 0. Nowy kod: #include<iostream> using namespace std; int main() { int tab[ 3 ][ 3 ]; for( int a = 0; a < 3; a++ ) { for( int b = 0; b < 3; b++ ) cin >> tab[ a ][ b ]; } int z = 0, suma = 0, w = - 1000000; for( int i = 0; i < 2 * 3 - 1; i++ ) { suma = 0; for( int x = 0; x < 3; x++ ) { for( int y = 0; y < 3; y++ ) { if( x + y == i ) suma += tab[ x ][ y ]; } if( suma > w ) { w = suma; z = i + 1; } } } cout << z << ": "; for( int x = 0; x < 3; x++ ) { for( int y = 0; y < 3; y++ ) { if( x + y == z - 1 ) cout << tab[ x ][ y ] << " "; } } return 0; }
|
|
Luq |
» 2017-12-17 14:19:50 if( suma > w ) { w = suma; z = i + 1; } |
Ta część jest w niewłaściwym miejscu. |
|
Wiesław Temat założony przez niniejszego użytkownika |
» 2017-12-17 21:31:28 Dziękuję bardzo, problem rozwiązany :) |
|
Wiesław Temat założony przez niniejszego użytkownika |
Przyspieszenie programu » 2017-12-18 21:19:35 W sumie mam jeszcze jeden problem - da się jakoś przyspieszyć działanie programu? Ponieważ dla dużych tablic zajmuje dużo czasu (i pamięci). Pozdrawiam. EDIT: Wymyśliłem coś takiego. Dziękuję za dawną pomoc jeszcze raz. #include<iostream> using namespace std; int main() { cin.tie( 0 ); ios_base::sync_with_stdio( 0 ); std::flush( std::cout ); short n; cin >> n; short tab[ n ][ n ]; int luke[ 2 * n - 1 ]; for( int y = 0; y < 2 * n - 1; y++ ) luke[ y ] = 0; for( short a = 0; a < n; a++ ) { for( short b = 0; b < n; b++ ) cin >> tab[ a ][ b ]; } int suma = 0, z = 0, p = 0; for( int a = 0; a < n; a++ ) { for( int b = 0; b < n; b++ ) { p = a + b; luke[ p ] += tab[ a ][ b ]; } } int y = luke[ 0 ]; for( short c = 1; c < 2 * n - 1; c++ ) { if( luke[ c ] > y ) { y = luke[ c ]; z = c; } } cout << z + 1 << ": "; for( short x = 0; x < n; x++ ) { for( short y = 0; y < n; y++ ) { if( x + y == z ) cout << tab[ x ][ y ] << " "; } } return 0; }
|
|
« 1 » |