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.
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 na razie przerabiam podstawowe pętle.
poza tym 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:)

1

Sformatuj prawidłowo ten kod, zmienne do pętli zadeklaruj w pętli, ponazywaj zmienne prawidłowo, wtedy od razu byś zobaczył, że to co powodowało błąd to było przypisanie a = m; b = i; podczas gdy wartość wczytywana od użytkownika była do zmiennej n.

Przeformatowane, usunięte zbędne zmienne i warunki (pisane z palca)

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

		if (nwd <= 1)
			wynik += a;
	}

	printf("wynik = %d\n", wynik);
	return 0;
}

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