Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Problem z dodawaniem "ręcznym" liczb z tablicy.

Ostatnio zmodyfikowano 2014-12-23 12:42
Autor Wiadomość
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)
C/C++
//
//  main.cpp
//  Mnozenie SPOJ
//
//  Created by Domin568 on 14/12/14.
//  Copyright (c) 2014 Domin568. All rights reserved.
//

#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 }; // tablice TYLKO do testowania jednego przykładu
   
    std::map < short, std::vector < short >> mnozenia;
    // od tad następuje całe mnożenie
    for( int i =( sizeof( l1 ) / 2 ) - 1; i >= 0; i-- )
    {
        // niebede opisywal sposobu mnozenia tych liczb bo to nie jest moj problem
        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; // tutaj znajduja sie 5176 , 3235 , 1941
   
    // scalanie wszystkich wyników do std::stringa
   
    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; // zbiera wyniki mnożeń
        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 ); // zapisuje do tablicy wszystkie wyniki mnożeń
        std::cout << bufor << std::endl; // 5176 \n 3235 \n 1941 \n
    }
   
    // Problem następuje tutaj, jak dodać wszystkie wyniki z wynikówMnożeń metodą ręczną.
   
    return 0;
}
Dziękuję z góry za jakąkolwiek pomoc ;)
P-123219
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
P-123222
Monika90
» 2014-12-22 16:58:35
A które to jest zadanie na SPOJu?
P-123231
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.
P-123264
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;



P-123269
« 1 »
  Strona 1 z 1