Skocz do zawartości
zdybo

Prosty program C++ z matury z informatyki (Wielokrotności, liczby względnie pierwsze)

    Rekomendowane odpowiedzi

    zdybo

    Panowie, pomocy ! :D To może lekki offtop, bo nie dotyczy androida, ale jestem we wielkiej potrzebie - mam nadzieję, że mnie nie zganicie :)

    Potrzeba mi zrobić to zadanie w c++ , językiem bardzo początkującym, np. bez tych return, algorytmu Euklidesa itp.

    5qYRXxs.jpg

    Tutaj link do rozwiązania, lecz jest troszkę za bardzo "profesjonalnie" napisany.

    537b96265a41e_p.jpg

    Rozwiązanie to pochodzi ze strony gloswielkopolski.pl

    Z góry dzięki za pomoc :)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Dzakus
    Napisano (edytowane)

    Która to matura jest?

    BTW. Zdajesz sobie sprawę, że jest dopuszczona na maturze Java? Tylko twoja szkoła musi to zaakceptować.

    Postaram się omówić pokrótce to zadanie.

    a) Ile jest wierszy, w których jedna z występujących tam liczb jest wielokrotnością

    tej drugiej?

    W tym zdaniu oznacza, że jedna liczba musi się dzielić bez reszty przez drugą. W tym celu służy operator modulo (reszta z dzielenia) zapisywany za pomocą symbola %.

    Przykład co to jest moduło:

    5 % 2 = 1

    10 % 5 = 0

    22 % 10 = 2

    Gdy chcemy sprawdzić, czy liczba jedna liczba jest wielokrotnością drugiej wystarczy sprawdzić, czy da się podzielić bez reszty zatem

    20 50

    Obliczenia

    20 % 50 = 20 nie dzieli się bez reszty

    50 % 20 = 10 nie dzieli się bez reszty

    Wystarczy, że a % b wynosiło 0 lub b % a wynosiło 0, aby spełnić założenia zadania. Jedna dzieli się bez reszty przez drugą.

    -------------------------

    b) Ile jest wierszy zawierających pary liczb względnie pierwszych, czyli takich, których

    największy wspólny dzielnik tych liczb równa się 1?

    Do tego rozwiązania tego zadania należy wiedzieć co to są liczby względnie pierwsze.

    Za wikipedią:

    Liczby względnie pierwsze – liczby całkowite, które nie mają innych poza jedynką wspólnych dzielników w rozkładzie na czynniki pierwsze lub, równoważnie, ich największym wspólnym dzielnikiem jest jedność; te, w których żadna para nie ma wspólnych dzielników w rozkładzie poza jedynką lub, równoważnie, których
    największy wspólny dzielnik dla dowolnej pary wynosi jeden
    , nazywa się parami względnie pierwszymi.

    Algorytmów obliczania NWD jest wiele. Niektóre z nich wrzucam ci tutaj : Wklej.to - po prostu wklej to! - paste: L3kJf (Java)

    Najprostszy do wytłumaczenia wydaje mi się ten nazwany WithDivision.

    public int calc(int a, int b) {
    while (a != b) {
    	if(a > b) {
    		a = a - b;
    	}else{
    		b = b - a;
    	}
    }
    return a;
    }

    W tym algorytmie po prostu odejmujemy próbujemy zrównać z sobą dwie liczby odejmując od większej mniejsza.

    Przykładowo przebieg liczb dla 55 6

    55 6 
    49 6
    43 6
    37 6
    31 6
    25 6
    19 6
    13 6
    7 6
    1 6
    1 5
    1 4
    1 3
    1 2
    1 1

    czyli jest to liczba względnie pierwsza, ponieważ nwd wynosi 1

    25 10
    15 10
    5 10
    5 5

    czyli nie jest to liczba względnia pierwsza, ponieważ nwd wynosi 5

    -------------------------

    c) Ile jest wierszy, dla których suma cyfr pierwszej liczby jest równa sumie cyfr

    drugiej liczby?

    Tutaj musimy wykonywać trzy operacje w pętli.

    1 - odczytywanie liczby pojedynczej - najwygodniej jedności.

    Do tego posłuży operator modulo z 10 (w takim systemie są zapisane liczby)

    jednosc = a % 10;

    Przykład

    105 % 10 = 5

    100 % 10 = 0

    1 % 10 = 1

    2 - kasować jedną liczbę, czyli dzielić♥przez 10, co powoduje "przesunięcie przecinka" w prawo, lecz my nie zapisujemy wartości po przecinku, bo operujemy na int

    a /=10;

    123456 / 10 = 12345

    12345 / 10 = 1234

    1234 / 10 = 123

    123 / 10 = 12

    12 / 10 = 1

    3 - sumować liczby z operacji pierwszej.

    suma +=jednosc

    Kod wynikowy

    public static int calc(int a) {
    	int suma = 0;
    	while (a > 10) {
    		int jednosc = a % 10;  // Operacje 1 
    		a /= 10;	// Przesuniecie liczby
    		suma +=jednosc; // Dodanie liczby do ogolnej sumy
    	}
    	return suma;
    }

    Edytowane przez Dzakus

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    zdybo

    Matura podstawowa z tego roku. Mam to zrobić w c++ , bo jestem w pierwszej klasie, dodatkowo na mat-fiz, wiec nie mam rozszerzonej informatyki. Nauczyciel mi nie przyjmie w javie, bo stwierdzi, że nie zrobiłem tego sam bo nie znam tego języka- w sumie dobrze :P Ale dzięki za to wyjaśnienie :)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Dzakus

    Nic nie szkodzi, abyś się samemu nauczył Javy w domu. Gdy zna się podstawy C++ to Java jest prostsza. Składnie ma uproszczoną i Eclipse bardzo miło pomaga przy pisaniu kodu. Eclipse też jest dopuszczony do matury. Ja też w szkole mało co się uczę, ale w domu pracuje nad informatyką. Maturę mam dopiero w przyszłym roku. Choć to zadanie pewnie bez problemu w gimnazjum bym rozwiązał, bo nie jest zbyt trudne.

    Po za tym jedyna różnice, która widzę w moim tłumaczeniu pomiędzy C++, a Javą to w C++ niepotrzebny jest modyfikator public/static

    Pełne rozwiązanie w Javie. Nietestowane, bo nie dostałem pliku, ale nie przewiduje błędów.

    public class ParyLiczb{
    
    public static int sumDigit(int a) {
    	int suma = 0;
    	while (a > 10) {
    		int jednosc = a % 10;  	// Operacje 1 
    		a /= 10;				// Przesuniecie liczby
    		suma +=jednosc; 		// Dodanie liczby do ogolnej sumy
    	}
    	return suma;
    }
    
    public static int nwd(int a, int b) {
    	while (a != b) {
    		if (a > b) {
    			a = a - b;
    		} else {
    			b = b - a;
    		}
    	}
    	return a;
    }
    
    public static main(String[] args) throws Exception {
    
    	int odp_a = 0, odp_b = 0, odp_c = 0;
    	BufferedReader br = new BufferedReader(new FileReader("dane.txt"));
    	String line;
    	while ((line = br.readLine()) != null) {
    	   	String[] collumns = line.split(" ");
    	   	int liczb_a = Integer.parseInt(collumns[0]);
    		int liczb_b = Integer.parseInt(collumns[1]);
    
    		if((liczb_a % liczb_b = 0) || (liczb_b % liczb_a = 0)){
    			odp_a++;
    		}
    
    		if(nwd(liczb_a, liczb_b) == 1){
    			odp_b++;
    		}
    
    		if(sumDigit(liczb_a) == sumDigit(liczb_a)){
    			odp_c++;
    		}
    
    	}
    	br.close();
    
    	System.out.println("Odpowiedzi: ");
    	System.out.println("a) " + odp_a);
    	System.out.println("b) " + odp_b);
    	System.out.println("c) " + odp_c);
    }
    } 

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.