[C#]Proc nefunguje cyklus?

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod hyn1234 26. 10. 2013 23:14

Zdravim,
jsem v jazyce C# novacek. Snazim se zpracovat nasledujici:

Kód: Vybrat vše
while (x==0){
                if(n % x == 0){
                    final=final++;
                }
                x=x--;
            }


Muj umysl je, ze se zada cislo "n". promenna "x" je x=n-1;
Cyklus by mel fungovat tak, ze bude probihat, dokud x nebude 0 a mela by provadet, ze pokazde kdyz n/x bude cele cislo, tak se promenna "final", ktera se hned od zacatku rovna 1 (definovano mimo zverejnenou cast kodu) zvyssi o 1.
Zaroven uplne pri kazdem opakovani cyklu by se x melo snizit o 1.
Diky za rady!
Naposledy upravil Vebloud dne 29. 10. 2013 11:38, celkově upraveno 1
Důvod: Všichni to píšou na začátek a do hranatejch, tak já to dám na konec a do kulatejch...
hyn1234
Kolemjdoucí

Odeslat příspěvekod Bespi_ 26. 10. 2013 23:29

Zacni tim ze misto WHILE pouzij FOR. Pro toto pouziti se hodi vic.
Bespi_
Junior

Odeslat příspěvekod meme1255 26. 10. 2013 23:31

Kód: Vybrat vše
while (x!=0)
{
if(n % x == 0)
   {
     final=final++;
    }
  x= x--;
}




Pokud dobře chápu příspěvek, tak dokud x!=0, pak se ten cyklus provádí. A asi by ten kód bylo lepší napsat jako
Kód: Vybrat vše
for (x>0;x--)
{
   if(n % x == 0)
   {
     final=final++;
   }

}
meme1255
Junior
Uživatelský avatar

Odeslat příspěvekod hyn1234 26. 10. 2013 23:42

Když jsem použil ten while, který jste mi tu upravili a vyzkoušel s číslem 15, výsledek byl 11, i když by měl být 7... (Když číslo 15 dělím postupně čísly v intervalu <1,14>, celé číslo je výsledkem pouze v 7 případech...)

-- 26. 10. 2013 23:48 --

tedy.. špatně pochopeno zadání.. snažím se o program na vypočítání eulerovy fce... :-|
hyn1234
Kolemjdoucí

Odeslat příspěvekod meme1255 26. 10. 2013 23:54

Neměl by se v té fci provozovat prvočíselný rozklad?
A já teda nevím, ale číslo 15 je dělitelné pouze 1, 3, 5 a 15, takže kde by se vzalo 7 dělení? :hm
Mezi čísly 1-14 jsou 3 čísla, která dělí 15 --> tudíž 11 by bylo dobře, pokud by to ukazovalo čísla, která nedělí 15
Naposledy upravil meme1255 dne 26. 10. 2013 23:58, celkově upraveno 2
meme1255
Junior
Uživatelský avatar

Odeslat příspěvekod hyn1234 26. 10. 2013 23:57

měl, to mi teď došlo...:-)
takže opět další hodina ztracena špatně pochopeným zadáním..:D
ovšem jsem stejně v koncích jako předtím, protože nevím, jak tento rozklad udělám..

-- 26. 10. 2013 23:59 --

jojo, je to tak.. jen potřebuju vážně ten rozklad, se kterým si nyní nevím rady..
hyn1234
Kolemjdoucí

Odeslat příspěvekod meme1255 27. 10. 2013 00:02

Definice prvočísla: Prvočíslo je takové číslo, které není děletelné žádným jiným číslem krom sebe sama a 1; —> Prvočíslo musí být liché (kromě čísla 2).
meme1255
Junior
Uživatelský avatar

Odeslat příspěvekod hyn1234 27. 10. 2013 00:04

Co je prvočíslo vím.. Akorát přemýšlím, jak ten program učinit funkčním..
Musím nějak získat prvočísla, která dělí zadané číslo (n) a pak zjistit, jaká čísla <1,n> jsou těmito prvočísly dělitelná..:/
hyn1234
Kolemjdoucí

Odeslat příspěvekod meme1255 27. 10. 2013 00:13

Tak prvočísla získám tak, že vyhodím ze seznamu všechna sudá čísla.
Pak vyhodím všechna čísla dělitelná 3.
Pak 5,7,11,13 ...

A pokud √n < než nejbližší další prvočíslo, tak zastavit.

Edit 0:30:
Takže třeba pro číslo 5 by to vypadlo následovně: 1 2 3 4 5
Vyhodíme číslo 4, neboť jsou to násobky 2. Vyhodíme taky 1, neboť nám nepomůže.
zbyde nám 2 3 5.
Dál už to nijak dělit nejde, tudíž jsme získali prvočísla 2, 3 a 5. A kriterium dělitelnost 3 je součet cifer dělitelných třemi a kritérium 5 je, že číslo končí na 5 nebo 0. Uložíme si získaná prvočísla do pole.

Kdyby bylo n 10, pak je získanými prvočísly dělitelná 4( 2) 6 (2 a 3), 9 (3) a 10 (2 a 5)
a to by se zjistilo tak, že se čísly získanými výše (a taky výše uloženými do pole) číslo postupně dělilo, a pokud by to prošlo, pak by se uložilo třeba do dalšího pole. Nic lepšího mi teď nenapadá, možná když bych se na to podíval jindy.
Kód už psát nebudu .. ZzZz


meme1255
Junior
Uživatelský avatar

Odeslat příspěvekod hyn1234 27. 10. 2013 00:54

Ok, díky..:)
poslední dotaz:
Tady je můj kód co jsem vyplodil
Kód: Vybrat vše
#include<stdio.h>
#include<math.h>
main()
{
int a=2,i=2,c,pocet=0,g;
int final,x;
final=0;
printf("Zadejte n: ");
scanf("%d",&g);
x=g;
while (a<=g)
{
for (i=2;i<a;++i)
{
c=(a%i);
if (c==0)
goto neni;
else continue;
}
while (x!=0)
{
if(x % a != 0) {
final++;
}
x--;
}
++pocet;
neni: ++a;
}
printf("phi(%d) = %d.\n",g,final);
}


Při zadání čísla 15 mi to správně vyhodí 8...
Avšak při zadání čísla 1845, kdy odpověď má být 960, mi to vyhodí 923..:/
Nevíte prosím proč?
hyn1234
Kolemjdoucí

Odeslat příspěvekod meme1255 27. 10. 2013 01:28

Někdy dopoledne na to kouknu,jen takhle od pohledu mi přijde goto jako zvěrstvo. A odsazovat závorky by též pomohlo.
meme1255
Junior
Uživatelský avatar

Odeslat příspěvekod Wikan 27. 10. 2013 10:24

Proč jsi začal s C# a pak to přepsal do C?
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod PiranhaGreg 27. 10. 2013 10:45

Zrovna včera jsme dostali na ČVUT FIT tento úkol O:-). Btw. na 5.5 bodů je to fakt primitivní. Udělej si funkci na spočítání největšího společnýho dělitele (to ukazovali na přednáškách x-krát) a pak jen kontroluj hodnoty do n, jestli mají nějakýho společnýho dělitele... Tahle verze je i s ošetřením vstupu asi na 10 řádků ;-) .
Přílohy
progtest.png
PiranhaGreg
Mírně pokročilý
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků