Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Liczby pierwsze

Ostatnio zmodyfikowano 2015-03-22 21:58
Autor Wiadomość
Pietia
Temat założony przez niniejszego użytkownika
Liczby pierwsze
» 2015-03-22 13:56:44
Mam zrobić program, który sumuje liczby mniejsze od n w jednej funkcji i w drugiej sumuje liczby pierwsze mniejsze od n, napisałem warunek dla liczb pierwszych w funkc2 ale nie gra, co robię źle?

C/C++
# include <stdio.h>

int funkc1( unsigned * n );
int funkc2( unsigned x );

main()
{
    unsigned n;
    printf( "Podaj liczbe n\n" );
    scanf( "%d", & n );
    printf( "Suma liczb mniejszych od n to %d\n", funkc1( & n ) );
    printf( "Suma liczb pierwszych do n to %d\n", funkc2( n ) );
}

int funkc1( unsigned * n )
{
    int i, licz = 0;
    for( i = 0; i <* n; i++ )
    {
        licz += i;
    }
    * n = licz;
   
    return licz;
}

int funkc2( unsigned x )
{
   
    double i = 2, j = 2, k = 0;
   
    for( i; i < x; i++ )
    {
        do
        {
            k += i;
            j++;
        }
        while(( i / j ) != 1.00 );
       
    }
   
    return k;
}
P-128925
Esteban
» 2015-03-22 14:25:27
Pętla do{ } while(i/j)

i oraz j mają taką samą wartość na początku, jeżeli będziesz zwiększał j to ciągle będziesz otrzymywał ułamek,
przez co warunek while nigdy nie zwróci wartości fałsz
P-128930
Pietia
Temat założony przez niniejszego użytkownika
» 2015-03-22 15:09:25
A teraz? TO nie jest tak, że pętla wewnętrzna za każdym razem będzie się robić x razy na jedno wykonanie pętli wewnętrznej? Bo już nie wiem jak do tego podejść, jeśli jest tak jak piszę to powinno być dobrze ale nie jest:

C/C++
# include <stdio.h>

int funkc1( unsigned * n );
int funkc2( unsigned x );

main()
{
    unsigned n;
    printf( "Podaj liczbe n\n" );
    scanf( "%d", & n );
    printf( "Suma liczb mniejszych od n to %d\n", funkc1( & n ) );
    printf( "Suma liczb pierwszych do n to %d\n", funkc2( n ) );
}

int funkc1( unsigned * n )
{
    int i, licz = 0;
    for( i = 0; i <* n; i++ )
    {
        licz += i;
    }
    * n = licz;
   
    return licz;
}

int funkc2( unsigned x )
{
   
    int i = 2, j = 2, k = 0;
   
    for( i; i <= x; i++ )
    {
        for( j; j < x; j++ )
        {
            if(( i % j ) == 0 )
            {
                k += i;
            }
        }
    }
   
   
    return k;
}
P-128933
Esteban
» 2015-03-22 17:46:35
Dobrze kombinujesz

uwagi
Do funkcji nr2 przechodzi już zmieniony/przerobiony i przemielony argument z funkcji nr1
(zakładam z zadania, że tak nie miało być)

Liczby które używasz w pętli for lepiej deklaruj na początku jej np
for( int i = 2; i <= x; i++ )

Trzeba poprawić warunek
C/C++
if(( i % j ) == 0 )
{
    k += i;
}

Teraz robisz, że kiedy liczba jest podzielna przez te wszystkie liczby j to warunek się wykonuje
Tymczasem nasza liczba pierwsza ,,i" może tyko raz być podzielna (przez samą siebie) (też przez liczbę 1, ale to sprytnie pominąłeś)

C/C++
#include <stdio.h>
#include <iostream>

int funkc1( unsigned * n );
int funkc2( unsigned x );

main()
{
    unsigned n;
    printf( "Podaj liczbe n\n" );
    scanf( "%d", & n );
    int z = n;
    printf( "Suma liczb mniejszych od n to %d\n", funkc1( & n ) );
   
    printf( "Suma liczb pierwszych do n to %d\n", funkc2( z ) );
}

int funkc1( unsigned * n )
{
    int i, licz = 0;
    for( i = 0; i <* n; i++ )
    {
        licz += i;
    }
    * n = licz;
   
    return licz;
}

int funkc2( unsigned x )
{
    int k = 0, warunek;
    for( int i = 2; i <= x; i++ )
    {
        warunek = 0;
        for( int j = 2; j <= x; j++ ) //mala zmiana na <=
        {
            if(( i % j ) == 0 )
                 warunek++;
           
        }
        if( warunek == 1 ) k += i;
        //tylko 1, ni wiecej, ni mniej
    }
    return k;
}
P-128958
Pietia
Temat założony przez niniejszego użytkownika
» 2015-03-22 21:58:16
Dzięki wielkie, bardzo mi pomogłeś:-)
Dobry patent z tym warunkiem.
P-128983
« 1 »
  Strona 1 z 1