Program wyświetlający wszystkie liczby mniejsze lub równe podanej liczbie

0

Cześć, co w tym kodzie jest nie tak? Ma wyświetlać wszystkie liczby pierwsze mniejsze lub równe podanej liczbie, a wyświetla jakąś liczbę z 'kosmosu'" i ciąg wszystkich liczb, od podanej liczby do jednego. Nie widze w nim błędu. Na moje oko powinien działać a nie działa;/

#include <stdio.h>

int main(void)
{
    int liczba, x, y, z;
    int tab[100];

    z=0;

    printf("Podaj liczbe, a ja podam Ci wszystkie liczby pierwsze mniejsze lub rowne tej liczbie ");
    scanf("%d", &liczba);

    for ( ; liczba>0; liczba--)
    {
        y=0;

        if (liczba==1)
        y=1;

        x=liczba;

        for ( ; x>0; x--)
        {
            if ((liczba%x)==0)
            y++;
        }

        if (y==2)
        {
            tab[z] = liczba;
            z++;
        }

    }

    for( ; z>=0; z--)
    printf("%d\n", tab[z]);

    getchar();
    return 0;

}
 
2

Po pierwsze, generuj sobie liczby pierwsze sitem. Potem je tylko wypisz.

0

Winerfresh wiem, jak w tej metodzie wygenerować liczby, które nie są liczbami pierwszymi (te które trzeba 'skreślić') ale jak mam wyświetlić tym sposobem liczby pierwsze? Nie mam pomysłu jak to zrobić.

0

Aha czyli w zasadzie jedyna droga to znaleźć tą liczbę, i potem o ile jest np w elemencie o indeksie i dajesz i=i+1, zwiększasz i (albo pakujesz zastępowanie w for-a) i tak do końca tablicy. Ew wstawić na to miejsce od razu ostatni element, ale wtedy nie będą po kolei co skomplikuje wyświetlanie (trzeba je będzie przed nim z powrotem posegregować). Zakładając że to tablica zwykła a nie dynamiczna, trzeba też będzie przechowywać w jakiejś zmiennej ilość elementów i ją za każdym "trafieniem" zmniejszać. parzyste odrzucaj tworząc tablicę, z całą pewnością nie są pierwsze. Tworząc ją zacznij od 3 i"inkrementuj" o 2. Zawsze będzie mniej liczenia, a to przyśpieszy całość.

0

Co do tego sita, napisałem taki kod tylko że nie do końca działa jak powinien. Co jest źle?

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

int main(void)
{
    int liczba, a, x, y, z;
    int tab[1000], tab2[1000];
    double pierwiastek;

    printf("Podaj liczbe, a ja podam Ci wszystkie liczby pierwsze mniejsze lub rowne tej liczbie ");
    scanf("%d", &liczba);

    a=liczba;
    y=liczba;

    for ( ; liczba>0; liczba--)
    {
        tab[liczba] = liczba;
    }

    pierwiastek = sqrt(liczba);

    for (x = floor(pierwiastek); x>=2; x--)
    {
        z = x;
        while(z<=y)
        {
            z+=z;
            tab2[z] = z;
        }
    }

    for ( ; a>0; a--)
    {
        if (tab[a] != tab2[a])
        printf("%d\n", tab[a]);
    }



    getchar();
    return 0;

} 
0
#include <stdio.h>
#include <math.h>
 
int main(void)
{
    int n, i, j;
    int *tab = NULL;
 
    printf("Podaj n, a ja wyswietle liczby pierwsze od 2 do n:");
    scanf("%d", &n);
    
    tab = (int*) calloc(n+1, sizeof *tab);
 
    for (i = 2; i*i <= n; i++ )
    {
        if (tab[i] == 1)
            continue;
        for (j = 2 * i ; j <= n; j += i)
            tab[j] = 1;
    }
            
    for (i = 2; i <= n; i++)
        if (tab[i] == 0)
            printf("%d ", i);
            
    free(tab);
    
    system("PAUSE"); //keep console window open in Debug Mode
    return 0;
} 
0
for (i = 2; i*i <= n; i++ )
    {
        if (tab[i] == 1)
            continue; 

Przecież tab[i] niegdy nie będzie równe 1. Na początku równe jest 2 a później je zwiększamy więc o co chodzi?

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