[C++] Problem z dodawaniem "ręcznym" liczb z tablicy.
Ostatnio zmodyfikowano 2014-12-23 12:42
domin568 Temat założony przez niniejszego użytkownika |
[C++] Problem z dodawaniem "ręcznym" liczb z tablicy. » 2014-12-22 12:45:56 Witam, przez ostanie kilka dni borykam się z problemem jak za pomocą algorytmu można dodać tablice z liczbami według zasady mnożenia ręcznego. Trudno mi wytłumaczyć jak ma to działać dlatego zrobiłem specjalny rysunek przedstawiający jak to zrobiłem : http://postimg.org/image/j8liynjlx/ wynikiMnozenia są tablicą do której wrzucałem wyniki z mnożenia ręcznego ( które potem trzeba dodać aby otrzymać wynik. Proszę o pomoc a tutaj jest pełen kod (opisany)
#include <iostream> #include <map> #include <vector>
int main( int argc, const char * argv[] ) { short l1[ 3 ] = { 6, 4, 7 }; short l2[ 3 ] = { 3, 5, 8 }; std::map < short, std::vector < short >> mnozenia; for( int i =( sizeof( l1 ) / 2 ) - 1; i >= 0; i-- ) { short tmp2 = l2[ i ]; int reszta = 0; char oddzielone[ 3 ]; std::vector < short > cyfryWRzedzie; for( int j =( sizeof( l2 ) / 2 ) - 1; j >= 0; j-- ) { short tmp1 = l1[ j ]; short liczbaDoZapisania; short mnozenie = tmp1 * tmp2 + reszta; if( mnozenie > 9 && j > 0 ) { sprintf( oddzielone, "%d", mnozenie ); reszta = oddzielone[ 0 ] - 48; liczbaDoZapisania = oddzielone[ 1 ] - 48; } else { liczbaDoZapisania = mnozenie; } cyfryWRzedzie.push_back( liczbaDoZapisania ); } mnozenia[ i ] = cyfryWRzedzie; } std::vector < std::string > wynikiMnozenia; for( int i =( int ) mnozenia.size() - 1; i >= 0; i-- ) { std::vector < short > tmpVector = mnozenia[ i ]; std::reverse( std::begin( tmpVector ), std::end( tmpVector ) ); std::string bufor; for( int j = 0; j < tmpVector.size(); j++ ) { short tmp = tmpVector.at( j ); char buff[ 3 ]; sprintf( buff, "%d", tmp ); std::string str( buff ); bufor = bufor + str; } wynikiMnozenia.push_back( bufor ); std::cout << bufor << std::endl; } return 0; }
Dziękuję z góry za jakąkolwiek pomoc ;) |
|
darko202 |
» 2014-12-22 14:01:13 Nie wiem jakie masz założenia wstępne, tzn. jakich zmiennych musisz użyć ani jak ma wyglądać Twój program Ja kiedyś miałem podobny problem tzn. kazano mi napisać funkcję silnia dla dużych liczb. np. silnia(10 000) tam również musiałem wykonać mnożenie które pokazujesz na rysunku. Wówczas skorzystałem z kontenera vector<int> ale można to zrobić na dowolnym kontenerze dynamicznym opiszę wszystkie kroki jakie wykonałem 1. utworzyłem class DużaLiczba { vector<int> liczba; // wektor ma metody push, pop_up, length itp. dlatego nie trzeba ich było tworzyć jak w przypadku np. tablicy dynamicznej // konstruktor - tutaj zapisywałem liczbę do wektora w postaci pozycja jednostkowa liczba[0] dziesiątkowa liczba[1] setki liczba[2] itd // destruktor void Mnozenie(DuzaLiczba x){ DuzaLiczba wynik = new DuzaLiczna(0); potem kolejno mnożyłem tak jak przy mnożeniu pod kreska odpowiednie kolumny i wyniki zapisywałem w odpowiednich pozycjach wynik
np. liczba = 234; x = 567; pozycja w wektorze 5 4 3 2 1 0 liczba = 2 3 4 x = 5 6 7 wynik 1 mnożenie 7 14 21 28 2 mnożenie 6 12 32 45 28 3 mnożenie 5 10 27 52 45 28 wynik.Przesuniecie(); a 10 27 52 47 8 b 10 27 56 7 8 c 10 33 2 7 8 d 13 3 2 7 8 e 1 3 3 2 7 8 liczba = wynik; }
void Przesuniecie() {} przesuniecie kolejnych pozycji jak w przykładzie wyżej
operator=
void Drukuj() { // wyrzucenie liczby na ekran} };
Analizując optycznie to co zaprezentowałeś zaczynasz podobnie ale wyniki zapisujesz do stringów przez co utrudniasz sobie algorytm, ale jeśli tak ma wyglądać Twój program to w miejscu w którym utknąłeś zrób analogiczne dodawanie jak moje wyżej |
|
Monika90 |
» 2014-12-22 16:58:35 A które to jest zadanie na SPOJu? |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2014-12-23 11:19:35 To zadanie : http://pl.spoj.com/problems/TMUL/ . Darko202 dziękuję za pomoc, spróbuje napisać według twojego sposobu :) //edit Nie mogę zrozumieć tego sposobu, skoro( 6 * 4 == 45). Nie rozumiem również dlaczego wynik pierwszego mnożenia (28) powtarzasz kilka razy. |
|
darko202 |
» 2014-12-23 12:42:16 w logu pokazuję stany na poszczególnych pozycjach vector<int> wynik dlatego 28 jest na pozycji 0, stany to po kolejnych przebiegach się nie zmieniają poprawiłem kalkulacje i mam nadzieję, ze teraz będzie bardziej jasne co zrobiłem np. liczba = 234; x = 567; pozycja w wektorze 5 4 3 2 1 0 liczba = 2 3 4 x = 5 6 7 wynik 0 0 0 1 mnożenie 7 +14 21 28 =14 21 28 2 mnożenie 6 +12 18 24 =12 32 45 28 3 mnożenie 5 +10 15 20 =10 27 52 45 28
wynik.Przesuniecie(); a 10 27 52 47 8 b 10 27 56 7 8 c 10 33 2 7 8 d 13 3 2 7 8 e 1 3 3 2 7 8 // otrzymana liczba to 133 278 zapisana jest na 6 pozycjach liczba = wynik;
|
|
« 1 » |