Ez az algoritmus jo szerintetek valoban, de akkor miert nem jon ki?
0 es 100 kozott kitalalja hogy mire gondoltunk,ha megadjuk Z3 Z5 Z7 nek a maradek osztasasat
Harom maradek osztasa Z3
Ot.................Z5
....
ezeket megadjuk es ez szerint kikene jonni a szamnak amit gondoltunk:
Number := (70*Z3 + 21*Z5 + 15*Z7) mod 105;
a pelda szerint Z3: 0 Z5: 0 Z7: 7 akkor a Numer 15
de 0 at kapok :S
pl. ha 1/0/7 akkor 70 et kapok
Szerintem értelmetlen zagyvaság, amit írtál. Nem lehetett volna pontosan idemásolni vagy belinkelni, miről van szó?
#1 bemutatta, hogy a 0 eredmény helyes. Ha mást vártál, akkor az algoritmus hasznavehetetlen. Tehát egyéb magyarázatot egyelőre nem szükséges keresni.
Valóban ahogy felettem is írták az algoritmusod egy zagyvaság, ha algoritmusnak lehet nevezni.
Először is had szögezzem le hogy ezt nem fogod megúszni ciklus nélkül, úgyhogy a legegyszerűbb az lenne ha 0-tól 100-ig végigmennél a számokon és megnéznéd hogy melyikre igaz hogy 3-al, 5-el, 7-el osztva Z3, Z5 és Z7-et ad maradékul, de úgy látom hogy egy hatékonyabb megoldást keresel.
A hatékonyabb megoldást úgy hívják hogy kínai maradéktétel:
Megpróbálom egyszerűen vázolni a helyzetet egy példával. Legyen a számunk x=53. Ekkor amit tudunk:
x ≡ 2 (mod 3)
x ≡ 3 (mod 5)
x ≡ 4 (mod 7)
Mivel a 3, az 5 és a 7 is prím, felírhatjuk úgy hogy:
x ≡ 5*7*A + 3*7*B + 3*5*C (mod 3*5*7)
x ≡ 35*A + 21*B + 15*C (mod 105)
ahol
35*A ≡ 2 (mod 3)
21*B ≡ 3 (mod 5)
15*C ≡ 4 (mod 7)
Ezt mondja ki a tétel, innentől a te dolgod hogy számolod ki az A-t, B-t és a C-t. A legegyszerűbb ha próbálkozol, vagy brute-force megoldással végigmész rajta.
Hogy ne hagyjam itt befejezetlenül, kiszámolom:
35*A ≡ 2 (mod 3) A=?
35*1 mod 3 = 2, tehát A=1
21*B ≡ 3 (mod 5) B=?
21*1 mod 5 = 1,
21*3 mod 5 = 3, tehát B=3
15*C ≡ 4 (mod 7) C=?
15*1 mod 7 = 1,
15*4 mod 7 = 4, tehát C=4
Lehet látni hogy most szerencsém volt és viszonylag hamar, 1 vagy 2 lépésből kijöttek a számok. A trükk az volt hogy az 1-et fel tudtam szorozni annyival mindig, hogy a megoldás jöjjön ki. Van amikor nem ilyen egyszerű és végig kell próbálni az összeset. Vissza az eredeti kongruenciára:
x ≡ 35*A + 21*B + 15*C (mod 105)
x ≡ 35*1 + 21*3 + 15*4 (mod 105)
x ≡ 158 (mod 105)
x ≡ 53 (mod 105)
tehát kijött hogy x=53. Megjegyzem hogy az x 0 és 104 között lesz, ezért nem biztos hogy kisebb mint 100.
>a pelda szerint Z3: 0 Z5: 0 Z7: 7 akkor a Numer 15
Amúgy 7-el osztva hogy adhat bármi is 7-et maradékul? o_O
15 mod 3 = 0
15 mod 5 = 0
15 mod 7 = 1
Még a példa is rossz? Vagy félreértettem volna valamit?
Visszaellenőrizve a számolásomból amúgy helyes a képleted csak amit írtál előtte és utána értelmetlen.
35*A ≡ Z3 (mod 3)
2*A ≡ Z3 (mod 3)
4*A ≡ 2*Z3 (mod 3)
A ≡ 2*Z3 (mod 3)
21*B ≡ Z5 (mod 5)
B ≡ Z5 (mod 5)
15*C ≡ Z7 (mod 7)
C ≡ Z7 (mod 7)
Tehát A=2*Z3, B=Z5, C=Z7.
Visszahelyettesítve:
x ≡ 35*A + 21*B + 15*C (mod 105)
x ≡ 70*Z3 + 21*Z5 + 15*Z7 (mod 105)
A probléma hogy szerintem nem tudod mit csinálsz, ha 7-el osztasz legfeljebb 6 lehet a maradék és a példád sem stimmel.
Azert nem masoltam be mert szlovak nyelvu a pelda.
(Lazarusban)Meg volt adva az hogy ha pushbutton-re kattintva mit vegezzen el a program ez meg volt adva a peldaban. Ha helyessen tettuk be a edit,label - okat akkor nem volt semmi mas dolgunk vele,mert ugy volt megadva a kod.
:
procedure TForm1.Button1Click(Sender: TObject); //vznikne po dvojkliku na Button1 vo formulári
var Zvysok3, Zvysok5, Zvysok7, MysleneCislo: integer; //deklarácia použitých premenných
begin
Zvysok3 := StrToInt (Edit1.Text); //vstup hodnôt potrebných k výpočtu
Zvysok5 := StrToInt (Edit2.Text);
Zvysok7 := StrToInt (Edit3.Text);
MysleneCislo := (70*Zvysok3 + 21*Zvysok5 + 15*Zvysok7) mod 105; //výpočet podľa vzorca
Label4.Caption := 'Myslel si si číslo ' + IntToStr (MysleneCislo); //vypísanie výsledku
end;
És az miért baj, ha szlovák nyelvű? Nem, mintha egy kukkot is tudnék szlovákul, de annyit ki tudtunk volna silabizálni belőle, hogy te másoltad ki rosszul a példaként felhozott értékeket, vagy eredetileg sem voltak helyesek. A kódrészlet alapján máris rekonstruálni lehet a programot, és abból az derül ki, hogy az algoritmus működik, az általad beírt 0,0,7 érték viszont hülyeség, ami lehet, hogy az eredeti példa hibás szedésének köszönhető. Így utólag érthető: a gondolt szám 3-mal, 5-tel és 7-tel való osztásának maradékát kell megadnod. Ez 15 esetén mennyi is?
15 \ 3 = 5, maradék: 0
15 \ 5 = 3, maradék: 0
15 \ 7 = 2, maradék: 1
A képlet szerint: (70*0 + 21*0 + 15*1) \ 105 = 0, maradék: >>> 15 <<<
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!