Zadania z Asemblera, POMOCY

majczalek

Użytkownik
Dołączył
Czerwiec 9, 2013
Posty
1
Witam.

Proszę o pomoc z rozwiązaniem tych dwóch łamigłówek. Mam napisać kod wyliczający szukane podane w zadaniu. Niestety nie mam zielonego pojęcia jak się za to zabrać:

Kod:
 http://www.swiatmatematyki.pl/index.php?p=88

Kod:
 [url]http://www.swiatmatematyki.pl/index.php?p=94[/url]

Z góry dziekuję za każdą formę pomocy.

Pozdrawiam, majczalek
 

Dark Smark

Były Moderator
Dołączył
Kwiecień 29, 2006
Posty
1953
DO NR 1:
Niestety z ASM mało co pamiętam więc może ktoś zdekompiluje lub przełoży. Najłatwiej zrobić to iteracyjnie bo znamy ilość niewiadomych. Oznaczyłem ilość niewiadomych od a do j tak jak naniosłem na zdjęciu poniżej:


\

Następnie wykonujemy brute-force interacyjnie testując warunek logiczny "gdy dane działanie I kolejne działanie I n-działanie daje logiczne 1 (koniunkcje), to znamy rozwiązanie". Pisane na szybko:

Kod:
#include <iostream>

using namespace std;


int main(int argc, char *argv[]) {
    
    
    int a,b,c,d,e,f,g,h,i,j; //niewiadome
    int n=9;                //zaglebianie
    bool wynik = false;
    cout << "Przeliczam...";
    for(int a=0; a<n; a++) 
    {
        for(int b=0; b<n; b++) 
        {
            for(int c=0; c<n; c++)  
            {
                for(int d=0; d<n; d++)  
                {    
                    for(int e=0; e<n; e++)  
                    {
                        for(int f=0; f<n; f++)  
                        {
                            for(int g=0; g<n; g++)  
                            {
                                for(int h=0; h<n; h++)  
                                {
                                    for(int i=0; i<n; i++)  
                                    {
                                        for(int j=0; j<n; j++)  
                                        {
                                                wynik =         a/2-b==c &&
                                                                d+e-4==5 &&
                                                                4+f-g==h &&
                                                                i-3+j==8 &&    
                                                                a*d/4==i &&
                                                                2+e-f==3 &&
                                                                b*4+g==j &&
                                                                c*5-h==8;
                                                                
                                                                if (wynik==1) 
                                                                {
                                                                    cout << " Znaleziono rozwiazanie!"<<endl;
                                                                    cout << " a=" << a <<endl;
                                                                    cout << " b=" << b <<endl;
                                                                    cout << " c=" << c <<endl;
                                                                    cout << " d=" << d <<endl;
                                                                    cout << " e=" << e <<endl;
                                                                    cout << " f=" << f <<endl;
                                                                    cout << " g=" << g <<endl;
                                                                    cout << " h=" << h <<endl;
                                                                    cout << " i=" << i <<endl;
                                                                    cout << " j=" << j <<endl;
                                                                    cin >> n;    //PAUSE
                                                                    return 0;
                                                                     
                                                                }
                                                                
                
                                        }
                
                                    }
                
                                }
                
                            }
                
                        }
                
                    }
                
                }    
            }
        }
    }
    
    


    cout << " Brak rozwiazania dla n="<< n << "!" <<endl;
    cin >> n;
    return 0;
}

Najbardziej łopatologiczne to rozwiązałem, pewnie jest fajniejsze ale nie mam czasu pomyśleć nad tym. Być może da się ułożyć jakieś równanie i rozwiązać za pomocą macierzy gaussowskich, jeśli dane wczytywalibyśmy surowo z pliku np, to warto to wczytać do macierzy ij i za pomocą np: odwrotnej notacji polskiej trzeba by sprawdzić priorytety działań.

Pamiętam jak pisało się kiedyś w asm jakieś aplikacje to zagłębienia warunków/pętli na procku 8080/8088 były katorgą czasami...


Niestety złożoność mojego algorytmu jest dosyć wysoka jak na informatykę, o ile patrzę n^10, przy wysokim parametrze n który ustawiamy, będzie trwało to "dłuuugooo."
Rozwiązanie mojego programu:
Przeliczam... Znaleziono rozwiazanie! a=5
b=0
c=2
d=4
e=5
f=4
g=6
h=2
i=5
j=6

Nie podałeś wgl na jaki procek asm. Przyda Ci się głównie MOV, MUL (o ile istnieje), DIV, LOOPy z odpowiednimi warunkami do testów logicznych itd...
BTW: Nie podali czy rozwiązanie ma być w zbiorze liczb naturalnycj.


W zad2, można zastosować praktycznie tą samą koncepcje przez co nie trzeba być z algorytmiki jakkolwiek obcykanym.
 
Ostatnia edycja:

D.F.

Były Moderator
Dołączył
Listopad 4, 2009
Posty
493
Ktoś kiedyś powiedział, że kod, który ma więcej niż 3 poziomy wcięć nadaje się do przepisania. ;-)
 
Do góry Bottom