Prośba o sprawdzenie zadania domowego numer 2 rozdział 53
Ostatnio zmodyfikowano 2022-01-05 15:26
Masterofironfist Temat założony przez niniejszego użytkownika |
» 2022-01-05 14:52:25 #include <iostream> using namespace std;
unsigned int multiplication( unsigned int a, unsigned int b ) { unsigned int aCopy = a; a = 0; for( int i = 31; i >= 0; i-- ) { if(( b & 1 << i ) != 0 ) { a +=( aCopy << i ); } } return a; }
int main() { unsigned int a, b; cin >> a >> b; cout << "a = " << multiplication( a, b ); } Proszę oto kolejna wersja programu. Nie wierze że teraz wystarczy 1 linia kodu w warunku i program realizuje to samo jest pan prawdziwym mistrzem programowania. Dziękuje za pańską pomoc przy tym programie, bo inaczej bym nie uwierzył że można to tak prosto zapisać. |
|
pekfos |
» 2022-01-05 15:13:03 Takie rozwiązanie jest zadowalające, dobra robota. Co do czytelności, jeśli zerujesz argument funkcji, to może być to znak że należy zostawić go w spokoju (albo usunąć). Zamiast robić kopię argumentu w dodatkowej zmiennej, możesz w tej zmiennej mieć wynik który obliczasz. Dla samej ciekawostki pokażę jeszcze jak można usunąć dekrementację z pętli i przy okazji przywrócić wcześniejszy koniec algorytmu: unsigned int multiplication( unsigned int a, unsigned int b ) { unsigned int result = 0; while( b != 0 ) { if( b & 1 ) result += a; a <<= 1; b >>= 1; } return result; } Z każdym przebiegiem dzielę mnożnik przez 2 i koryguję to w mnożnej. Gdy ostatnia jedynka wyjdzie z mnożnika, algorytm się kończy. |
|
Masterofironfist Temat założony przez niniejszego użytkownika |
» 2022-01-05 15:26:09 Bardzo ciekawe. No teraz widzę jak ważna jest optymalizacja. Dziękuje za całą pomoc. A także za ciekawą przygodę z podstawami C++. Ogólnie bardzo to ciekawe wszystko. Pańskie rozwiązanie również jest bardzo ciekawe. A teraz chyba czas zamknąć ten wątek bo chyba można uznać go za rozwiązany. |
|
1 2 « 3 » |