C - nwd wariuje

2016-05-18 12:22

Rejestracja: 3 lata temu

Ostatnio: 2 lata temu

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? ;)

wywal continue (z przeróbką) - vpiotr 2016-05-18 13:22

Pozostało 580 znaków

kq
2016-05-18 12:53
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 8 godzin temu

Lokalizacja: Szczecin

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.

Pozostało 580 znaków

2016-05-18 13:06

Rejestracja: 3 lata temu

Ostatnio: 2 lata temu

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ć?

Pozostało 580 znaków

kq
2016-05-18 13:21
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 8 godzin temu

Lokalizacja: Szczecin

1

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


Pozostało 580 znaków

2016-05-18 13:23

Rejestracja: 3 lata temu

Ostatnio: 2 lata temu

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

Pozostało 580 znaków

kq
2016-05-18 13:26
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 8 godzin temu

Lokalizacja: Szczecin

1

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


Pozostało 580 znaków

2016-05-18 13:35

Rejestracja: 3 lata temu

Ostatnio: 2 lata temu

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ę

Pozostało 580 znaków

kq
2016-05-18 13:44
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 8 godzin temu

Lokalizacja: Szczecin

1

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


Nie wiem co reprezentuje, wiem co powinien reprezentować: sumę liczb < n względnie pierwszych z n. - bogdans 2016-05-18 13:46
Okej, ale w takim razie nazwa tematu zupełnie bez sensu jest ;) - kq 2016-05-18 13:47

Pozostało 580 znaków

2016-05-18 13:44
Moderator

Rejestracja: 11 lat temu

Ostatnio: 1 rok temu

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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2016-05-18 14:28
Moderator

Rejestracja: 12 lat temu

Ostatnio: 13 godzin temu

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.

edytowany 2x, ostatnio: hauleth, 2016-05-18 14:37
I dopisujemy do listy liczbę 1. - bogdans 2016-05-18 14:33

Pozostało 580 znaków

2016-05-18 14:48

Rejestracja: 3 lata temu

Ostatnio: 2 lata temu

0

Dzięki wszystki za czynną dyskusje i pomoc :)

Nie jestem w tym jeszcze dobry, więc powoli to przyswajam ;)

Co do sposobu przez tablicowanie, to niestety, ale nie przerabiałem ich jeszcze, jak narazie przerabiam podstawowe pętle.
Pozatym chodzi mi też głównie o to, by zrozumieć, co robię nie tak ( nie szukam gotowej odpowiedzi, chciałbym załapać, co jest złęgo w moim rozumowaniu -> nawet jeżeli nie jest to najszybszy sposób , aczkolwiek naprawdę doceniam pomoc :) ).
Zmodyfikowałem swój kod, wcześniejszy jeżeli dobrze rozumiem, sprawdzał nwd ale nic nie robił z tym faktem. Tutaj chyba jestem już bliżej rozwiązania:

#include <stdio.h>
main()
{
int a, b, i = 1,n, m = 1, wynik = 0, nwd = 0;
printf("Podaj naturalna liczbe n\n");
scanf("%d" , &n);
a = i;
b = m;
for (i = 1; i < n ; i++){
for( m = 1;  m < i ; m++)
if(( a % b == 0 ) && ( n % b == 0 ))
nwd = m ;
if( nwd > 1 )
continue;
else
wynik += i;
printf("wynik = %d\n" , wynik);
}
return 0;
}

Jednak dalej nie działa tak jak powinien. Do upadłego :P

edit:

ok, chyba się udało ;) pozakładałem klamry, poprzestawiałem trochę i wydaje mi się, ze działa poprawnie :)

#include <stdio.h>
main()
{
int a, b, i = 1,n, m = 1, wynik = 0, nwd = 0;
printf("Podaj naturalna liczbe n\n");
scanf("%d" , &n);
for (i = 2; i < n ; i++){
for( m = 1;  m <= i ; m++)
{
     b = m;
     a = i;
if(( a % b == 0 ) && ( n % b == 0 ))
nwd = m ;
}
if( nwd > 1 )
continue;
else
wynik += i;
printf("wynik = %d\n" , wynik);
}
return 0;
}

dzięki jeszcze raz:)

edytowany 1x, ostatnio: miki313, 2016-05-18 14:57

Pozostało 580 znaków

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