Liczby pierwsze z zakresu – return jeden dla liczby pierwszej, return 0 dla innych

Odpowiedz Nowy wątek
2018-11-08 20:42
0

Mój problem polega na tym, że jeśli liczby są pierwsze to return jest 1, natomiast dla innych jest to return 0. Zrobiłem to w taki sposób

#include <stdio.h>
#include <conio.h>
int czyPierwsza(int liczba)
{
int i, j, n, n2, p;
printf("Podaj zakres: ");
    scanf("%d" "%d", &n, &n2);
    for(i = n; i <= n2; ++i)
    {
        p = 1;
        for(j = 2; j < i; ++j)
            if(i % j == 0)
            {
                p = 0;
                break;
            }
            {
        if(p)
    return 1;
    else return 0;
 
        }
    }
    }
    int main(void)
{
    int suma;
    suma=czyPierwsza(1);
    printf("%d", suma);
}

Wiem, że ten printf czyta tylko 1, ale nie wiem jak mam zrobić to inaczej. Musi to być oznaczone jedynką i int main musi czytać funkcje czyPierwsza. Mógłby ktoś jakoś wyjaśnić jak to zrobić?

edytowany 1x, ostatnio: furious programming, 2018-11-08 20:53
Sformatuj ten kod porządnie - przecież na to nie da się patrzeć. - Patryk27 2018-11-08 20:43

Pozostało 580 znaków

2018-11-08 23:11
1

Nie. No przyjrzyj się proszę temu, co piszesz — if(i=1). Jeszcze raz: i=1. Czyli „zmiennej i przypisz wartość 1”. Jaki to, Twoim zdaniem, ma związek z pierwszością?

edytowany 1x, ostatnio: Althorion, 2018-11-08 23:11
i==1 miało być, jednak wciąż to nie działa - klonstoper 2018-11-08 23:13
Ano nie działa. Teraz patrzysz, czy zmienna i ma wartość 1. Czy jest jedynką. To znowu nie ma żadnego związku z pierwszością. - Althorion 2018-11-08 23:14

Pozostało 580 znaków

2018-11-08 23:13
2

Jak się wykorzystuje wartość zwracaną przez funkcję?

Jeśli dobrze napisałeś funkcję czyPierwsza, to:

if(czyPierwsza(5))
{
    printf("TAK\n");
}
else
{
    printf("NIE\n");
}

Powinno wypisać TAK

Natomiast

if(czyPierwsza(500))
{
    printf("TAK\n");
}
else
{
    printf("NIE\n");
}

Powinno wypisać NIE

Jeśli wciąż nie rozumiesz, jak się to obsługuje, to przeczytaj rozdz. w podręczniku nt korzystania ze zwróconych przez funkcję wartości

 czyPierwsza(i);
    if(i=1)
    printf("%d", i);

NIE NIE NIE NIE NIE

Nie myślisz. Wybacz.

i to nie jest to, co zwróciła funkcja czyPierwsza

i to jest TA LICZBA O KTÓREJ CHCEMY WIEDZIEĆ CZY JEST PIERWSZA a NIE informacja czy jest ona pierwsza

Co bodaj jeszcze gorsze:

if(i=1)

pojedyncze = to jest instrukcja PRZYPISANIA NIE PORÓWNANIA

Od tej chwili i będzie równe 1 a nie wiem, czy tego chcesz (i to mają być kolejne liczby z zakresu a 1 nie należy do zakresu)

Instrukcja porównania to PODWÓJNE ==

edytowany 1x, ostatnio: kmph, 2018-11-08 23:14

Pozostało 580 znaków

2018-11-08 23:44
0

Dobra, ostatnie pytanie na dzisiaj, bo już i tak tego nie wymyślę, nie wiem może jutro na spokojnie się uda, ale przerasta mnie tak proste zadanie.
W funkcji czyPierwsza mam zwrócone 1 jak liczba jest pierwsza, 0 jak jest inna. W jaki sposób mogę to wykorzystać, skoro czyPierwsza(i) zmienia argumenty po kolei od liczby1 do liczby2, więc przyrównanie jej do 1 lub 0 nic nie da. Jaki inny mogę postawić warunek?

Pozostało 580 znaków

2018-11-08 23:45
1

Ależ jak najbardziej da! Dowiesz się, czy każda jedna konkretna liczba jest pierwsza czy nie, na czym Ci właśnie zależy.

Pozostało 580 znaków

2018-11-09 16:30
0

Zrobiłem dzisiaj to w ten sposób:

#include <stdio.h>
int czyPierwsza(int liczba)
{
int i, j, p;
scanf("%d", liczba);
    for(i = 2; i <= liczba; ++i)
    {
        p = 1;
        for(j = 2; j < i; ++j)
            if(i % j == 0)
            {
                p = 0;
                break;
            }
            {
        if(p)
    return 1;
    else return 0;
        }
    }
    }
    int main(void)
{
    int  liczba1, liczba2, i;
    printf("Podaj zakres: ");
    scanf("%d" "%d", &liczba1, &liczba2);
    for (i=liczba1; i<liczba2;i++)
    {
            if(czyPierwsza(i)==1)
        printf("\nLiczby pierwsze w zakresie od %d do %d: %d ", liczba1, liczba2, i);
        }
}

Jednak dalej jest źle. Rozumiem z tego, że if liczba jest pierwsza (załóżmy dla 7 return równa się 1 więc zgadza się z warunkiem) wyświetla ją w printf. Niestety cały weekend mi odpada, żeby jakoś z tym pokombinować, a niedługo muszę oddać...

Pozostało 580 znaków

2018-11-09 17:14
sig
0

Po co wczytujesz liczbę w czyPierwsza()? Wywal to i będzie działać dużo lepiej, bo nie na wczytanej tylko na tej co ją w parametrze dostanie. Dodatkowo jak okaże się nie pierwsza (brak reszty z dzielenia) to bym od razu return dał a nie break

próbowałem tak, ale wtedy mi wypisuje wszystkie liczby od do, a nie tylko pierwsze - klonstoper 2018-11-09 17:19

Pozostało 580 znaków

2018-11-09 17:44
0
int czyPierwsza(int liczba)
{
    int i;
    for (i = 2; i * i <= liczba; ++i) {
        if (liczba % i == 0)
              return 0;
    }
    return 1;
}
 
int main(void)
{
    int liczba1, liczba2, i;
    printf("Podaj zakres: ");
    scanf("%d %d", &liczba1, &liczba2);
    printf("\nLiczby pierwsze w zakresie od %d do %d:", liczba1, liczba2);
    for (i = liczba1; i < liczba2; i++) {
        if (czyPierwsza(i) == 1)
           printf(" %d", i);
    }
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Dziękuję, czyli rozumiem, że w funkcji było coś pomieszane? - klonstoper 2018-11-09 17:51
pilnuj wcięć, bo bez nich nie widać jak bardzo namieszałeś. Większość IDE robi to za ciebie. Nie wiem po co ci były dwie pętle for w czyPierwsza. - MarekR22 2018-11-09 17:53

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0