olokotampus Temat założony przez niniejszego użytkownika |
Czemu mój kod nie działa poprawnie dla cyfry 9? » 2014-10-11 14:48:15 Napisałem program do mnożenia dwóch liczb o dowolnej długości przez siebie (kwadrat) i wszystko działa dobrze, jeśli tylko w liczbie nie ma dziewiątek. Jeśli jest dziewiątka, to program nie przesuwa części dziesiętnej do następnej komórki wyniku: 9x9 = 81, 8 znika, z 1 wszystko ok. Męczę się z tym od paru dni, analizuję krok po kroku i dalej nie widzę błędu. Kod:
#include <iostream>
using namespace std;
char * kwadratPisemnie( char * liczba, int liczbaCyfr ) { char * wynik = new char[ liczbaCyfr * 2 ]; for( int i = 0; i <( liczbaCyfr * 2 ); i++ ) wynik[ i ] = 0; int przesuniecie; int wskaznikPozycji; int licznikDekrWskPoz = 0; for( int i = liczbaCyfr - 1; i >= 0; i-- ) { przesuniecie = 0; wskaznikPozycji =( liczbaCyfr * 2 ) - 1 - licznikDekrWskPoz; for( int j = liczbaCyfr - 1; j >= 0; j-- ) { wynik[ wskaznikPozycji ] +=( liczba[ i ] * liczba[ j ] ) % 10 + przesuniecie; przesuniecie =( liczba[ i ] * liczba[ j ] ) / 10; if( wynik[ wskaznikPozycji ] > 9 ) { przesuniecie +=( wynik[ wskaznikPozycji ] / 10 ); wynik[ wskaznikPozycji ] -=( wynik[ wskaznikPozycji ] / 10 ) * 10; } wskaznikPozycji--; } licznikDekrWskPoz++; } return wynik; }
int main() { char test1_liczba[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int test1_liczbaCyfr = 8; char test2_liczba[] = { 3, 7, 2, 0, 0, 4, 1, 2, 5, 7, 8, 8, 8, 1, 2, 0, 2 }; int test2_liczbaCyfr = 17; char test3_liczba[] = { 1, 2, 3, 4, 9, 5, 6 }; int test3_liczbaCyfr = 7; char * wynikMnozenia = kwadratPisemnie( test1_liczba, test1_liczbaCyfr ); cout << "12345678 do kwadratu to "; for( int i = 0; i < test1_liczbaCyfr * 2; i++ ) cout << wynikMnozenia[ i ] + 0; cout << endl; wynikMnozenia = kwadratPisemnie( test2_liczba, test2_liczbaCyfr ); cout << "37200412578881202 do kwadratu to "; for( int i = 0; i < test2_liczbaCyfr * 2; i++ ) cout << wynikMnozenia[ i ] + 0; cout << endl; wynikMnozenia = kwadratPisemnie( test3_liczba, test3_liczbaCyfr ); cout << "1234956 do kwadratu to "; for( int i = 0; i < test3_liczbaCyfr * 2; i++ ) cout << wynikMnozenia[ i ] + 0; cout << endl; return 0; }
|
|
stryku |
» 2014-10-11 15:13:07 Próbowałeś debugować? |
|
SocrateZ |
» 2014-10-11 15:41:32 Nie wiem o co ci chodzi z tą 9. Twój kod działa poprawnie dla 15 * 15, ale juz nie dla 25 * 25. Zapominasz o pozostałym przesunięciu po mnożeniu. bezpośrednio przed licznikDekrWskPoz++; dodaj to: if( przesuniecie > 0 ) wynik[ wskaznikPozycji ] += przesuniecie; Dlaczego tak? Przeanalizujmy: 15*15 ----- 5*5 = 25 - 2 dalej 1*5 = 5 + (2 reszty) = 7 1*5 = 5 1*1 = 1 + (0 reszty) = 1 ----- 75 + 15 ----- = 225
To działa Teraz: 25*25 ---- 5*5 = 25 - 2 dalej 2*5 = 10 + (2 reszty) = 12 (wycina jedynke, zostawia 2) <- Tutaj masz błąd 2*5 = 10 - 1 dalej 2*2 = 4 + (1 reszty) = 5 ---- 25 + 50 ----- = 525 Dlaczego 525 a nie 625? Pominięta została 1 - i dlatego pomiędzy przejściem pierwszej pętli należy wstawić powyższy kod Poza tym... komentarze pozostawiają wiele do życzenia... |
|
olokotampus Temat założony przez niniejszego użytkownika |
» 2014-10-12 17:27:08 Dziękuję, faktycznie zaczęło działać. :) Debugować próbowałem, ale QtCreator mi co chwila sam z siebie wywala jakieś świństwo w assemblerze przy uruchamianiu programu (nie zawsze, ale zbyt często) i nie mogłem dojść do końca debugowania. Co do komentarzy, to już od liceum się męczę z jasnymi i czytelnymi komentarzami, i chyba nie jestem do nich stworzony... |
|
« 1 » |