Írjunk programot,amely beolvas egy egész számot és meghatározza a szám törzstényezőit, például: 12 = 2*2*3
Algoritmus keresése
Határozzuk meg a 12 törzstényezőit:
szám |
osztó |
művelet magyarázata |
12 |
2 |
osztjuk a legkisebb osztóval, |
6 |
2 |
újra a legkisebb osztóval osztjuk |
3 |
3 |
itt is megkeressük a legkisebb osztót |
1 |
|
addig végezzük az eljárást, amíg a szám a sorozatos osztások után 1-re csökken. |
A kézi számolásos megoldás algoritmusa:
- kiválasztjuk a szám legkisebb osztóját. A legkisebb osztó keresése 2-től kezdődik. Ha a 2 nem osztója a számnak addig növeljük egyesével az osztó értékét, míg az osztója nem lesz. Ha megtaláltuk az osztót, akkor a számot elosztjuk vele.
- Ezt a folyamatot addig végezzük, míg az utoljára megtalált törzstényezővel történő osztása után a szám 1-re csökken.
A program megtervezéséhez a while ciklust választottuk:
- Szükségünk lesz két változóra:
szám tárolja a számot, melynek a törzstényezőit keressük.
osztó tartalmazza az aktuális osztót.
- A szám tartalma az osztás következtében állandóan csökken és végül 1 értéket veszi fel. A szám 1-re csökkenését while ciklussal figyeljük.
- Az osztó változót 2-re állítjuk, innen indul az oszthatóság keresése. A belső while ciklus addig növeli az osztó tartalmát, míg szám % osztó nullává válik, ekkor az osztó osztója a számnak. Az így megtalált osztót kiíratva és a szorzatot csillaggal jelölve előáll a szám törzstényezős felbontása.
A feladat az utolsó törzstényező utáni szorzójel (*) elhagyása. Az utolsó osztó osztásakor a szám tartalma 1 lesz, ezt egy feltételes utasításban vizsgálva, az utolsó osztó után a * nem kerül kiírásra.
A feladat megoldása:
// Törzstényezőkre bontás while ciklussal
private void button1_Click(object sender, EventArgs e)
{
int szám, osztó, db = 0;
string s = "";
if (textBox1.Text != "")
{
szám = Int32.Parse(textBox1.Text);
if (szám > 0)
{
while (szám != 1)
{
osztó = 2;
while (szám % osztó != 0)
{
osztó++;
}
szám = szám / osztó;
db++;
if (szám == 1)
s += osztó;
else s += osztó + "*";
}
if (db == 1)
{
textBox2.Text = s;
MessageBox.Show("A szám osztója önmaga!",
"Üzenet");
}
else
textBox2.Text = s;
}
else
MessageBox.Show("Az adat nem megfelelő!",
"Üzenet");
}
}
// Ha az adat változik a korábbi eredmény törlődik
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox2.Text = "";
}
A program futási eredményei: