Diskuze: úkol prvočísla

C++ C a C++ úkol prvočísla

Avatar
Petr
Neregistrovaný
Avatar
Petr:

Ahoj,potřeboval bych pomoct s úkolem : Sestavte program, který vypíše a spočítá všechna prvočísla v rozsahu (a,b) obsahujicí alespoň jednu číslici 0. Hodnoty a,b zadá uživatel. Jak to napsat v C. Děkuju za rady :)

 
Odpovědět 8.2.2014 18:55
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr
Jan Vargovský:

Snaž se něco napsat sám. Pak to tu pošli a my ti poradíme. Celé to za Tebe určitě psát nebudeme.

 
Nahoru Odpovědět  +1 8.2.2014 18:59
Avatar
Petr
Neregistrovaný
Avatar
Petr:

#include <stdio.h>
#include <stdlib.h>

int je_prvoc (int c)
{
int i;

for (i = 2; i < c; i++)
{
if ( c % i == 0)
return 0;
}
return 1;
}

int main()
{
int cislo = 200000;
int i, p1,a,b,pocet=0;

printf("Zadej a od : ");
scanf("%d",&a);
printf("Zadej b do : ");
scanf("%d",&b);
for (i=2; i <= cislo; i++)
{
p1=je_prvoc(i);
if (p1!=0)
{
if ((i>a) && (i<b))
printf("\n%5d",i);
}
}
while(cislo>0)
{
pocet++;
cislo=cislo/10;
}
printf("Pocet:%d",po­cet);
return 0;
}
Mám to takhle,ale prostě nevím jak tam dát aby to obsahovalo nulo a spočítalo čísla v rozshau a,b.

 
Nahoru Odpovědět 8.2.2014 19:02
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Petr
Honza Bittner:

Vlož to znovu přes ikonku vložit kód - takové 2 papárky s pluskem.

Nahoru Odpovědět 8.2.2014 19:06
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Petr
Neregistrovaný
Avatar
Petr:
#include <stdio.h>
#include <stdlib.h>

int je_prvoc (int c)
{
    int i;

    for (i = 2; i < c; i++)
    {
        if ( c % i == 0)
            return 0;
    }
    return 1;
}



int main()
{
    int cislo = 200000;
    int i, p1,a,b;

    printf("Zadej a od : ");
    scanf("%d",&a);
    printf("Zadej b do : ");
    scanf("%d",&b);
    for (i=2; i <= cislo; i++)
    {
        p1=je_prvoc(i);
        if (p1!=0)
        {
            if ((i>a) && (i<b))
                printf("\n%5d",i);
        }
    }
        return 0;
}
 
Nahoru Odpovědět 8.2.2014 19:08
Avatar
Odpovídá na Petr
Libor Šimo (libcosenior):

V prvom rade si musíš ujasniť čo sú to prvočísla.
Ak to nevieš, použi google.

Nahoru Odpovědět  +1 8.2.2014 19:14
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Petr
Honza Bittner:

C neumim, ale pokud koukám dobře:

  1. Proč projíždíš cyklus 200,000 krát, když chceš čísla od A do B?
  2. místo
p1=je_prvoc(i);
if (p1!=0) { ... }

můžeš napsat

if (je_prvoc(i)) { ... }
  1. do toho ifu ^^ už dáš rovnou print.
Editováno 8.2.2014 19:16
Nahoru Odpovědět 8.2.2014 19:15
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Odpovídá na Honza Bittner
Michal Žůrek (misaz):

dávat print do toho ifu funkce je_prvoc je prasárna, ale on učitel je zřejmě nic jiného neučil.

Editováno 8.2.2014 19:43
Nahoru Odpovědět  -1 8.2.2014 19:43
Nesnáším {}, proto se jim vyhýbám.
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Honza Bittner:

Co je za prasárnu na

if (je_prvoc(i)) //vrací 1(true) nebo 0(false)
{
  printf("\n%d je prvočíslo",i);
}

? :)

Editováno 8.2.2014 19:48
Nahoru Odpovědět  +6 8.2.2014 19:47
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Odpovídá na Honza Bittner
Libor Šimo (libcosenior):

V céčku je to trošku inakšie.
toto:
p1=je_prvoc(i);
vypíše chybu:
undefined reference to `je_prvoc'
Najprv by musel napísať funkciu: je_prvoc() a až potom ju môže použiť!

Editováno 8.2.2014 20:02
Nahoru Odpovědět 8.2.2014 20:00
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr
David Čápka:

Fce na prvočísla mi přijde OK, ten cyklus už ne. Měl bys tma mít něco jako:

for (i = a; i <= b; i++)

Co se týče té číslice 0, asi bych si to převedl na znaky, jestli to nějak jde, v céčku nedělám.

Nahoru Odpovědět 8.2.2014 20:10
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Benjibs
Člen
Avatar
Odpovídá na Honza Bittner
Benjibs:

To by aj mňa zaujímalo . . .

Nahoru Odpovědět 8.2.2014 20:15
1 + 1 = 2
Avatar
Libor Šimo (libcosenior):

Riešenie je napríklad takéto:

#include <stdio.h>
#include <math.h>

void prvocislo(int n)
{
  int je_prv = 1;
  int i;

  for(i = 2; i <= sqrt(n); ++i) {
    if (n % i == 0) {
      je_prv = 0;
      break;
    }
  }
  if (je_prv)
    printf("%d\n", n);
}

int main(void)
{
    int i, a, b;

    scanf("%d", &a);
    scanf("%d", &b);
    for (i = a; i <= b; i++)
    prvocislo(i);

    return 0;
}

len či budeš vedieť vysvetliť učiteľovi ako to funguje....:P

Nahoru Odpovědět 8.2.2014 20:19
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Čápka:

A kde máš tu kontrolu na číslici 0? :P

Nahoru Odpovědět 8.2.2014 20:21
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na Honza Bittner
Michal Žůrek (misaz):

funkce je_prvcoc() už podle názvu by měla vracet true nebo false.

Nahoru Odpovědět 8.2.2014 20:24
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na David Čápka
Libor Šimo (libcosenior):

Máš pravdu, oprava:
namiesto

if (je_prv)
  printf("%d\n", n);

treba dať

if (je_prv && n != 0)
    printf("%d\n", n);

Sdraco, nehľadaj v céčku nič zvláštneho, ty ho vlastne poznáš a určite lepšie ako ja :P, len v ňom nie sú objekty, všetko ostatné je rovnaké ako v iných jazykoch.

Nahoru Odpovědět 8.2.2014 20:30
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Michal Žůrek (misaz)
David Čápka:

Jo, libco to má divně, ale HoBi to myslel dobře.

Nahoru Odpovědět  +1 8.2.2014 20:30
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na Michal Žůrek (misaz)
Libor Šimo (libcosenior):

Ako som už uviedol vyššie, funkcia je_prvcoc() nie je súčasťou knihovní jazyka C a treba si ju najprv napísať!!! až potom sa dá použiť!

Nahoru Odpovědět 8.2.2014 20:32
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Čápka:

Tak samozřejmě, když je pojmenovaná česky :P Ale on jí tam má a pak ji volá, takže nevidím problém.

Nahoru Odpovědět  +1 8.2.2014 20:34
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Čápka:

Ne, v zadání je, které mají číslici 0. Takže třeba 10, 105 atd. Ty kontroluješ něco jiného.

Nahoru Odpovědět  +1 8.2.2014 20:35
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Libor Šimo (libcosenior):

Sorry, špatne som si pozrel jeho kód.

Nahoru Odpovědět  +1 8.2.2014 20:46
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Bože, asi som už unavený.
Je to ako písal sdraco, treba to previesť na znaky a tak nájsť '0' v číslach.

Nahoru Odpovědět 8.2.2014 20:49
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Petr
Neregistrovaný
Avatar
Petr:

Děkuju za rady! Vypadá to že to asi dáte do kupy jste fakt borci! Děkuju,já bych to nedal :))

 
Nahoru Odpovědět 8.2.2014 21:00
Avatar
Odpovídá na Petr
Libor Šimo (libcosenior):

Vyskúšaj toto:

#include <stdio.h>
#include <string.h>
#include <math.h>

int prvocislo(int n)
{
    int je_prv = 1;
    int i;

    for(i = 2; i <= sqrt(n); ++i) {
        if (n % i == 0) {
            je_prv = 0;
                break;
        }
    }
    if (je_prv)
        printf("%d\n", n);
}

int main(void)
{
    int i, j, a, b;
    char c[20];

    scanf("%d %d", &a, &b);
    for (i = a; i <= b; i++) {
        sprintf(c, "%i", i); // preveď integer na string
        for (j = 0; j < strlen(c); j++) { // prejdi strig po znakoch
            if (c[j] == '0') { // ak je tam nula
                prvocislo(i); // volaj funkciu
                break;
            }
        }
    }

    return 0;
}
Nahoru Odpovědět 9.2.2014 8:29
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Petr
Neregistrovaný
Avatar
Petr:

Teď to už sice vypíše ty prvočísla s nulou ale ostatní ne...Ale děkuju že mi s tim úkolem pomáháte :)

 
Nahoru Odpovědět 9.2.2014 9:11
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr
David Čápka:

No ale to má ten program podle tvého zadání dělat :D

Nahoru Odpovědět 9.2.2014 9:25
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr
Neregistrovaný
Avatar
Petr:

:D No jo máte pravdu :D A nevíte jak tam tedy hodit ještě aby mi to vypsalo jejich součet kolik jich to vypsalo? :)

 
Nahoru Odpovědět 9.2.2014 9:27
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Honza Bittner:

Nebylo by lepší kontrolovat přítomnost 0 v číslu pomocí regulárního výrazu? :P

Nahoru Odpovědět  -2 9.2.2014 9:39
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Odpovídá na Petr
Libor Šimo (libcosenior):

Rozhodni sa čo vlastne chceš. Súčet vypísaných čísiel alebo ich počet.

Nahoru Odpovědět 9.2.2014 9:52
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Nahoru Odpovědět 9.2.2014 9:53
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Petr
Neregistrovaný
Avatar
Petr:

Omlouvám se, je tam spočítá všechna prvočísla v rozsahu (a,b),takže počet vypsaných prvočísel. Děkuju

 
Nahoru Odpovědět 9.2.2014 9:55
Avatar
petrph
Člen
Avatar
Odpovídá na Honza Bittner
petrph:

To je zbytečně složitý, stačí jen zjistit zda tam je nebo není přes funkci strchr

 
Nahoru Odpovědět 9.2.2014 9:59
Avatar
petrph
Člen
Avatar
petrph:

Třeba takhle

#include <stdio.h>
#include <string.h>
#include <math.h>

int prvocislo(int n)
{
   int i;
  for(i = 2; i <= sqrt(n); ++i)
        if (n % i == 0) return 0;
  return 1;

}

int main(void)
{
    int i,a, b,num=0;
    char c[20];

    scanf("%d %d", &a, &b);
    for (i = a; i <= b; i++) {
        sprintf(c, "%i", i);
        if strchr(c,'0')
                if (prvocislo(i)) num++;

            }
       printf("Počet prvočísel s nulou je %d\n", num);
       return 1;
    }
 
Nahoru Odpovědět 9.2.2014 10:13
Avatar
Petr
Neregistrovaný
Avatar
Petr:

Tohle vypadá taky dobře :) Ale háže to jenom mě chybu u toho strchr?

 
Nahoru Odpovědět 9.2.2014 10:20
Avatar
vitamin
Člen
Avatar
vitamin:

Na zistenie ci cislo obsahuje nulu by malo stacit nieco taketo:

int maNulu(unsigned num){
        while(num >= 10){
                if(num % 10 == 0)return 1;
                num /= 10;
        }
        return !num;
}
 
Nahoru Odpovědět 9.2.2014 10:49
Avatar
Odpovídá na vitamin
Libor Šimo (libcosenior):

Skúsil som to tvoje a nefunguje mi to.
Možno som to špatne zapísal do kódu:

#include <stdio.h>

int maNulu(unsigned num){
    while(num >= 10){
        if(num % 10 == 0)
            return 1;
        num /= 10;
    }
    return !num;
}

int main(void)
{
    unsigned int i, j, a, b;

    scanf("%d %d", &a, &b);
    for (i = a; i <= b; i++) {
        j = maNulu(i);
        printf("%u\n", j);
    }

    return 0;
}
Nahoru Odpovědět 9.2.2014 11:21
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Petr
Neregistrovaný
Avatar
Petr:

A nevíte tedy jak tam mám vložit aby mi to napsalo kolik prvočísel to vypsalo? :) Díky

 
Nahoru Odpovědět 9.2.2014 11:45
Avatar
Libor Šimo (libcosenior):

takto:

int prvocislo(int n)
{
    int je_prv = 1;
    int i;

    for(i = 2; i <= sqrt(n); ++i) {
        if (n % i == 0) {
            je_prv = 0;
                break;
        }
    }
    if (je_prv) {
        printf("%d\n", n);
        return 1;
    }
}

int main(void)
{
    int i, j, a, b, pocet = 0;
    char c[20];

    scanf("%d %d", &a, &b);
    for (i = a; i <= b; i++) {
        sprintf(c, "%i", i); // preveď integer na string
        for (j = 0; j < strlen(c); j++) { // prejdi strig po znakoch
            if (c[j] == '0') { // ak je tam nula
                pocet += prvocislo(i); // volaj funkciu
                break;
            }
        }
    }
    printf("\nPocet vypisanych prvocisiel je %d.", pocet);

    return 0;
}
Editováno 9.2.2014 12:02
Nahoru Odpovědět 9.2.2014 12:01
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Petr
Neregistrovaný
Avatar
Petr:

Nějak mi to stále nefunguje :D protože když zadám že chci čísla od 5 do 555 tak mi to napíše že počet vypsaných prvočísel je 42066050.

 
Nahoru Odpovědět 9.2.2014 12:21
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Honza Bittner:

Změň ještě tu funkci prvocislo() tak aby vracela 1 nebo 0.

Nahoru Odpovědět  +1 9.2.2014 12:23
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Libor Šimo (libcosenior):

Mne to funguje správne.

Nahoru Odpovědět 9.2.2014 12:27
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Petr
Neregistrovaný
Avatar
Petr:

Aha,tak to je divný. A jaký tam máte připojený knihovny?...Třeba to bude tim...i když nevim tedy čim by to mohlo být.

 
Nahoru Odpovědět 9.2.2014 12:29
Avatar
Libor Šimo (libcosenior):

stdio.h, math.h a string.h

Nahoru Odpovědět 9.2.2014 12:32
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Možno je problém v tom, že to len skopíruješ. Môže to tam vložiť iné znaky ako vidíš v kóde.

Nahoru Odpovědět 9.2.2014 12:34
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Možno je problém v tom, že to len skopíruješ. Môže to tam vložiť iné znaky ako vidíš v kóde.

Nahoru Odpovědět 9.2.2014 12:34
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Petr
Neregistrovaný
Avatar
Petr:

Děkuju vám moc! Už to funguje!

 
Nahoru Odpovědět 9.2.2014 13:57
Avatar
petrph
Člen
Avatar
petrph:

Aha ,teď jsem se díval proč možná někomu nechodí ta funkce strchr.
Zkuste jí dát do závorky

if (strchr(c,'0'))

Přitom ale v překladači skutečně jazyka C to projde i bez závorky, ta chyba se hlásí až při použití překladače C++.

 
Nahoru Odpovědět 9.2.2014 14:12
Avatar
Nahoru Odpovědět 9.2.2014 15:48
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Malo by to vypisat len cisla obsahujuce 0 a vypisuje sa tam vsetko ine, len to co sa ma, sa nevypisuje.

Nahoru Odpovědět 9.2.2014 17:08
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Sorry, vlastne mas pravdu, ja som si nyslel, ze to bude vypisovat konkretne cisla.
:[

Nahoru Odpovědět 9.2.2014 17:18
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 52 zpráv z 52.