Dându-se un număr natural a, să se verifice dacă a și inversul (oglinditul) lui a sunt ambele numere prime.
Nu stiu ce am gresit...orice as scrie imi zice nu.
https://imgur.com/qGd9Nyq
https://imgur.com/qGd9Nyq
https://imgur.com/qGd9Nyq
https://imgur.com/qGd9Nyq
Răspunsuri la întrebare
Nu merge din mai multe motive:
1) Pentru ca nu ai dat la inceput valoarea 0 variabilei "ogl". Programul nu intelege, asa ca da un nr de la el, nr fara sens.
2) La primul while, a-ul devine 0 pentru ca tot il imparti "a=a/10;". Merge mai departe, iar cand ajunge la al doilea while, deja nu mai are pana unde sa mearga pentru ca nu exista a. "(i<a, i<ogl)". Ca sa nu pierzi valoarea unei variabile pe care urmeaza sa o modifici, introduci o alta variabila care sa ia valoarea acelei variabile pe care o imparti/modifici. In cazul asta, dupa ce ai citit a-ul, scrii (sa zicem) b=a; Dupa ce imparti a-ul si devine 0, te poti folosi de b, sau daca vrei neaparat cu variabila a, scrii a=b;
3) Ai incercat ceva la al doilea while, doar ca nu cum trebuie. E bine ca ai dat inainte valoarea 1 variabilelor "prim" si "prim2" si ai facut "if(a%i==0) prim=0;" iar la 'i' ai dat valoarea 2. Problema este ca 'i'-ul nu merge pana la <a, ci pana la <=a/2. Si ai pus acolo si "ogl". Pai nu-i bun. "a" si "ogl" nu sunt acelasi numar. Daca a=13, ogl va fi 31; Daca vrei sa respecte ambele conditii, pui while( i<a || i<ogl) (Dar tot nu ar fi fost bun la problema asta. Doar iti explic care-i treaba cu "||") || inseamna "sau". Deci, daca nu mai respecta prima conditie "i<a", programul vede acolo acel "sau", asa ca trece la urmatoarea conditie si repeta while-ul pana cand nu mai respecta nici a doua conditie. Daca era &&, stii, am vazut ca ai pus bine acolo la ultimul if. Ok, mai departe :)). Tot la al doilea while. Dupa primul si al doilea if, ai pus i++. 'i'-ul trebuie sa creasca o singura data cand face tot while-ul. De asemenea, al doilea if ar fi trebuit sa apartina tot lui while pentru ca si 'i'-ul de acolo creste. Ai grija la acolade. Ca al doilea if sa apartina tot lui while, ar fi trebuit ca acolada pe care ai deschis-o dupa while, sa o inchizi dupa al doilea if.
Sfat: Incearca cu for. E mult mai usor. Am rezolvat si eu problema. Ai in imagine cum am facut.
Dupa cum poti observa, prima data am verificat n-ul, daca-i nr prim. Iar daca este, trebuie sa faca palindromul (inv). Dupa, trebuie sa verifice daca si oglinditul lui n este tot nr prim, asa ca am folosit un alt for. Toate astea depind de primul for.
Ok, sper ca ai inteles ceva. E putin cam greu dar evoluezi cu timpul. Poti sa scrii rezolvarea pe care ti-am dat-o in c++ si sa incerci sa o intelegi. Bafta :D
import Data.List
{-
Dându-se un număr natural a, să se verifice dacă
a și inversul (oglinditul) lui a sunt ambele numere prime.
-}
f _ 0 = []
f m n = [nextM] ++ f nextM (div n 10)
where nextM = m * 10 + (mod n 10)
oppositeOf = last . f 0
prime k = length [ x | x <- [2..k], k `mod` x == 0] == 1
rPrimes a b | prime a && prime b = "Da"
| otherwise = "Nu"
main = do
i <- getLine
let i' = read i :: Int
print $ rPrimes i' (oppositeOf i')