C - nwd wariuje

0

Mam problem z zadaniem:
Napisz program, który wczytuje ze standardowego wejścia do-
datnią liczbę n i wypisuje na standardowym wyjściu sumę wszystkich
liczb mniejszych od n, względnie pierwszych z n.

Napisałem kod:

 #include <stdio.h>
main()
{
int n , m , i , wynik=0;
printf("Podaj liczbe calkowita dodatnia n\n");
scanf("%d" , &n);

for( i=2 ; i <= n ; i++)
for( m = 1 ; m <= n ; m++)
if( ( i % m == 0) && ( n % m == 0 ))
{
continue;
}
else 
wynik = i + wynik;
printf("wynik = %d" , wynik);
}

return 0;
}

W zamyśle mam, że użytkownik podaje liczbę, a program sprawdza wszystkie liczby po kolei , czy ich nwd = 1 , jeżeli tak to sumuje je.
Jednak coś poszło nie tak,
np dla n = 10:

<log> Podaj liczbe calkowita dodatnia n 10 wynik = 2wynik = 4wynik = 6wynik = 8wynik = 10wynik = 12wynik = 14wynik = 16wynik = 19wynik = 22wynik = 25wynik = 28wynik = 31wynik = 34wynik = 37wynik = 40wynik = 43wynik = 47wynik = 51wynik = 55wynik = 59wynik = 63wynik = 67wynik = 71wynik = 75wynik = 80wynik = 85wynik = 90wynik = 95wynik = 100wynik = 105wynik = 110wynik = 115wynik = 121wynik = 127wynik = 133wynik = 139wynik = 145wynik = 151wynik = 157wynik = 163wynik = 170wynik = 177wynik = 184wynik = 191wynik = 198wynik = 205wynik = 212wynik = 219wynik = 226wynik = 234wynik = 242wynik = 250wynik = 258wynik = 266wynik = 274wynik = 282wynik = 290wynik = 299wynik = 308wynik = 317wynik = 326wynik = 335wynik = 344wynik = 353wynik = 362wynik = 371wynik = 381wynik = 391wynik = 401wynik = 411wynik = 421wynik = 431 ------------------ (program exited with code: 0) Press return to continue </log>

Wie ktoś może gdzie jest błąd? ;)

1
  1. Czyżby Hitler to formatował? Czytać nie idzie, jak sam nie umiesz: http://format.krzaq.cc
  2. Z wyniku można wywnioskować, że wypisujesz w pętli a tego nie chcesz.
0
 #include <stdio.h>
main()
{
    int n, m, i, wynik = 1;
    printf("Podaj liczbe calkowita dodatnia n\n");
    scanf("%d", &n);

    for (i = 2; i < n; i++)
        for (m = 1; m < i; m++)
            if ((i % m == 0) && (n % m == 0)) {
                continue;
            }
            else
                wynik = i + wynik;
    printf("wynik = %d", wynik);

    return 0;
}

sformatowałem ;) Poprawiłem też część rzeczy, jednak dalej wynik nie taki jak powinien :/
dla n = 5 , wynik =12 a powinien 9.
Cóż powinienem zmienić?

1

Nie wiem co chcesz policzyć. NWD wymaga dwóch liczby, chyba, że o czymś nie wiem.

0

Zgadzam sie, jedną liczbą jest stałe n a drugą liczbą jest "i" , które rośnie, najpierw i = 1 , potem i =2 itd

1

Okej. Nadal nie rozumiem w jaki sposób 9 ma być dzielnikiem 5.

0

Nie będzie, bo n będzie zawsze większa od i oraz od m,
chyba że nie rozumiem swojej pętli, wtedy proszę o wytłumaczenie.
Bo ja to rozumiem tak:

  1. Użytkownik podaje swoje n
    2.Program je wczytuje
    3.Zaczyna się pętla-> i zwiększa się z każdą pętlą o 1 , aż nie osiągnie i = n
    4.Równocześnie pętla z m, która także się zwiększa o 1, sprawdza, czy n i i nie mają wspólnych dzielników, jeżeli mają to nie sumuje i
    5.Kiedy i <= n program się stopuje i podaje sumę
1

Może inaczej: co reprezentuje wynik? Na pewno nie jest to NWD (a nawet jeśli, to pomiędzy czym a czym?)

0

Mam wrażenie, że liczby 1,3,7 i 9 nie mają wspólnego dzielnika (różnego od 1) z liczbą 10. Zatem wynik powinien być 20.

2

Pomyślmy jak to zrobić poprawnie:

Zadanie: Wypisać wszystkie liczby mniejsze on zadanego N względnie pierwszego do danej.

Wnioski:

  • Nie potrzebujemy największego wspólnego dzielnika, wystarczy nam najmniejszy, gdyż jeśli jest on większy od 1 to wtedy liczby nie są względnie pierwsze.

Tak więc by rozwiązać to zadanie najszybciej jak się da:

  • Tablicujemy wszystkie liczby pierwsze w zadanym przedziale.
  • Dla danej N szukamy dzielników (D) wśród liczb pierwszych w przedziale (2; \sqrt{N}).
  • Dla każdej liczby w przedziale (2; N) wypisujemy te, które nie dzielą się przez jakąkolwiek liczbę w D.

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