C#-ban írtam egy programot, ami megnézi, hogy mi a legkisebb egyre végződő ötjegyű prímszám. De valamiért a 20001-et prímnek veszi, és akárhonnan indítom a k-t, a két feltétel közül az egyik hidegen hagyja. Miért?
k = 20000;
while (!prím(k) && k % 10 != 1)
k++;
A prímet így keresi meg:
static bool prím(int szám)
{
int i = 2;
while (i <= szám / 2 && szám % i != 0 )
{
i++;
}
if (szám == 2)
return true;
else
return !(szám % i == 0);
}
1. Miért is 20K-ról indulsz? Az első ötjegyű szám a 10K.
2. A while feltételedet gondoljuk át. Akkor növeli a k-t, amikor nem prím és nem 1-re végződik. -> Akkor áll meg ha prím VAGY 1-re végződik. Tanulság? ÉS helyett VAGY kell neked.
Köszi
Amúgy azért a 20k-t néztem, mert eredetileg 4 jegyű számot kerestem, és ott az 1001et dobta ki rögtön, és megnéztem hogy ezt csinálja-e egy olyan számmal is, ami tuti nem prím, így jött a 20001.
De azt még nem értem hogy miért nem jó neki az ÉS? A kettő feltételnek egyszerre kell teljesülnie nem?
Ez van a kódodban:
amíg (nem prím) ÉS (nem 1-re végződik)
addig növeli a k-t
Nevezzük a 2 feltételt A-nak és B-nek.
Ez akkor áll meg, ha az (A ÉS B) feltétel nem teljesül. Ez a feltétel akkor nem teljesül ha legalább az egyik tagja (A vagy B) hamis. Tehát: akkor áll meg a ciklus, ha !A VAGY !B
Visszatérve a feladatodhoz: akkor áll meg ha prím VAGY 1-re végződik. (Ha legalább az egyik a kettő közül.)
> A kettő feltételnek egyszerre kell teljesülnie nem?
Annak kell egyszerre teljesülnie, hogy prím és 1-re végződik. Ha negálod, akkor ÉS-ből VAGY lesz. Ez egy azonosság.
!(A ÉS B) = !A VAGY !B
"!(A ÉS B) = !A VAGY !B"
Köszi, ezt nem tudtam. Ez nagyon hasznos infó. :)
Köszönöm a többi választ is!
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!