Niech będzie nieujemną liczbą całkowitą, której najbardziej znacząca cyfra w zapisie dziesiętnym jest większa od i mniejsza od . Cyfrowym dopełnieniem liczby nazywamy liczbę całkowitą , której zapis dziesiętny otrzymujemy z zapisu dziesiętnego liczby przez zamianę każdej cyfry tego zapisu na cyfrę, która jest jej uzupełnieniem do .
Przykład:
Cyfrowym dopełnieniem liczby jest liczba .
W postaci pseudokodu lub w wybranym języku programowania napisz algorytm, który dla dodatniej liczby całkowitej obliczy jej cyfrowe dopełnienie . O liczbie wiadomo, że jej najbardziej znacząca cyfra jest większa od i mniejsza od .
Uwaga!
Twój algorytm może używać wyłącznie zmiennych przechowujących liczby całkowite oraz może operować wyłącznie na liczbach całkowitych. W zapisie algorytmu możesz korzystać tylko z instrukcji sterujących, operatorów arytmetycznych: dodawania, odejmowania, mnożenia, dzielenia, dzielenia całkowitego i reszty z dzielenia; operatorów logicznych, porównań i instrukcji przypisywania lub samodzielnie napisanych funkcji i procedur wykorzystujących powyższe operacje. Zabronione jest używanie funkcji wbudowanych dostępnych w językach programowania. Nie wolno w szczególności korzystać z żadnych funkcji zamiany z typu znakowego lub napisowego na liczbowy i odwrotnie.
Specyfikacja problemu:
Dane:
n – dodatnia liczba całkowita taka, że jej najbardziej znacząca cyfra jest większa od i mniejsza od
Wynik:
d – dodatnia liczba całkowita, cyfrowe dopełnienie liczby n
Zadanie zostało opracowane przez Centralną Komisję Egzaminacyjną i pojawiło się na egzaminie maturalnym z informatyki w maju roku (poziom rozszerzony). Cały arkusz można znaleźć na stronie internetowej CKE.
Ćwiczenie 1
R1XnD2yQvdHvQ2
Przykładowe rozwiązanie zadania, zapisane za pomocą listy kroków:
Zainicjuj potega jako 1.
Zainicjuj d jako 0.
Dopóki n > 0, wykonuj kroki 4‑8.
Zainicjuj cyfra jako n mod 10.
Podziel całkowicie n przez 10.
Do zmiennej cyfra przypisz 9 - cyfra.
Do zmiennej d dodaj potega * cyfra.
Pomnóż potega razy 10.
Zwróć d.
Przykładowe rozwiązanie zadania, zapisane za pomocą pseudokodu:
Linia 1. funkcja algorytm otwórz nawias okrągły n zamknij nawias okrągły.
Linia 2. potega ← 1.
Linia 3. d ← 0.
Linia 4. dopóki n zamknij nawias ostrokątny 0 wykonuj dwukropek.
Linia 5. cyfra ← n mod 10.
Linia 6. n ← n div 10.
Linia 7. cyfra ← 9 minus cyfra.
Linia 8. d ← d plus otwórz nawias okrągły potega asterysk cyfra zamknij nawias okrągły.
Linia 9. potega ← potega asterysk 10.
Linia 10. zwróć d.
Ważne!
Rozwiązania zapisane za pomocą języków programowania to tylko funkcje, nie są przeznaczone do testowania. Nie zadziałają, jeśli spróbujemy je uruchomić w środowisku programistycznym.
Przykładowe rozwiązanie w języku C++:
Linia 1. int algorytm otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int potega znak równości 1 średnik.
Linia 3. int d znak równości 0 średnik.
Linia 5. while otwórz nawias okrągły n zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. int cyfra znak równości n procent 10 średnik.
Linia 7. n znak równości n prawy ukośnik 10 średnik.
Linia 8. cyfra znak równości 9 minus cyfra średnik.
Linia 9. d znak równości d plus otwórz nawias okrągły potega asterysk cyfra zamknij nawias okrągły średnik.
Linia 10. potega znak równości potega asterysk 10 średnik.
Linia 11. zamknij nawias klamrowy.
Linia 12. return d średnik.
Linia 13. zamknij nawias klamrowy.
Przykładowe rozwiązanie w języku Java:
Linia 1. int algorytm otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int potega znak równości 1 średnik.
Linia 3. int d znak równości 0 średnik.
Linia 5. while otwórz nawias okrągły n zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. int cyfra znak równości n procent 10 średnik.
Linia 7. n znak równości n prawy ukośnik 10 średnik.
Linia 8. cyfra znak równości 9 minus cyfra średnik.
Linia 9. d znak równości d plus otwórz nawias okrągły potega asterysk cyfra zamknij nawias okrągły średnik.
Linia 10. potega znak równości potega asterysk 10 średnik.
Linia 11. zamknij nawias klamrowy.
Linia 12. return d średnik.
Linia 13. zamknij nawias klamrowy.
Przykładowe rozwiązanie w języku Python:
Linia 1. def algorytm otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 2. potega znak równości 1.
Linia 3. d znak równości 0.
Linia 5. while n zamknij nawias ostrokątny 0 dwukropek.
Linia 6. cyfra znak równości n procent 10.
Linia 7. n znak równości n prawy ukośnik prawy ukośnik 10.
Linia 8. cyfra znak równości 9 minus cyfra.
Linia 9. d znak równości d plus otwórz nawias okrągły potega asterysk cyfra zamknij nawias okrągły.
Linia 10. potega znak równości potega asterysk 10.
Linia 12. return d.
Schemat oceniania
4 pkt – za poprawny algorytm, w tym:
1 pkt – za poprawne odwoływanie się (w pętli) do cyfry najmniej znaczącej albo najbardziej znaczącej oraz jej modyfikację (obliczenie jej dopełnienia),
1 pkt – za poprawną konstrukcję pętli,
1 pkt – za poprawne instrukcje wyliczające kolejne potęgi liczby 10,
1 pkt – za otrzymanie poprawnej wartości d,
0 pkt – za odpowiedź błędną lub brak odpowiedzi.
Zadanie 5. Liczby skojarzone
Dwie różne liczby całkowite i większe od 1 nazwiemy skojarzonymi, jeśli suma wszystkich różnych dodatnich dzielników mniejszych od jest równa , a suma wszystkich różnych dodatnich dzielników mniejszych od jest równa .
Skojarzone są np. liczby i , ponieważ:
dzielnikami są: , , , , , , , , , , , a ich suma wynosi ,
dzielnikami są: , , , , , , , a suma tych liczb równa jest .
Dana jest liczba całkowita większa od . Ułóż i zapisz w wybranej przez siebie notacji algorytm, który znajdzie i wypisze liczbę skojarzoną z lub komunikat „NIE”, jeśli taka liczba nie istnieje.
W zapisie algorytmu możesz korzystać tylko z następujących operacji arytmetycznych: dodawania, odejmowania, mnożenia, dzielenia całkowitego i obliczania reszty z dzielenia.
Uwaga!
Przy ocenie algorytmu będzie brana pod uwagę liczba operacji arytmetycznych wykonywanych przez twój algorytm.
Specyfikacja problemu:
Dane:
liczba całkowita a > 1
Wynik:
liczba całkowita b skojarzona z a lub komunikat NIE, jeśli taka liczba nie istnieje
Zadanie zostało opracowane przez Centralną Komisję Egzaminacyjną i pojawiło się na egzaminie maturalnym z informatyki w maju roku (poziom rozszerzony). Cały arkusz można znaleźć na stronie internetowej CKE.
Ćwiczenie 2
RX5xD2HyxoWxi2
Przykładowe rozwiązanie zadania, zapisane za pomocą listy kroków:
Zainicjuj funkcję sumadz(n) i wykonuj w niej kroki 2‑10.
Zainicjuj suma jako 1.
Zainicjuj i jako 2.
Dopóki i * i <= n, wykonuj kroki 5‑9.
Jeżeli n mod i = 0, wykonaj kroki 6‑8.
Zwiększ suma o i.
Jeżeli n div i != i, wykonaj krok 8.
Zwiększ suma o n div i.
Zwiększ i o 1.
Zwróć suma.
Wpisz do zmiennej b wynik wywołania sumadz(a).
Wpisz do zmiennej y wynik wywołania sumadz(b - 1).
Jeżeli y - 1 = a wykonaj krok 14, w przeciwnym wypadku wykonaj krok 15.
Wypisz b - 1.
Wypisz "NIE".
Przykładowe rozwiązanie zadania, zapisane za pomocą pseudokodu:
Linia 1. funkcja sumadz otwórz nawias okrągły n zamknij nawias okrągły.
Linia 2. suma ← 1.
Linia 3. i ← 2.
Linia 4. dopóki i asterysk i otwórz nawias ostrokątny znak równości n wykonuj dwukropek.
Linia 5. jeżeli n mod i znak równości 0 dwukropek.
Linia 6. suma ← suma plus i.
Linia 7. jeżeli n div i wykrzyknik znak równości i dwukropek.
Linia 8. suma ← suma plus otwórz nawias okrągły n div i zamknij nawias okrągły.
Linia 9. i ← i plus 1.
Linia 10. zwróć suma.
Linia 12. b ← sumadz otwórz nawias okrągły a zamknij nawias okrągły.
Linia 13. y ← sumadz otwórz nawias okrągły b minus 1 zamknij nawias okrągły.
Linia 14. jeżeli y minus 1 znak równości a dwukropek.
Linia 15. wypisz b minus 1.
Linia 16. w przeciwnym wypadku dwukropek.
Linia 17. wypisz cudzysłów NIE cudzysłów.
Ważne!
Do rozwiązań zapisanych za pomocą języków programowania dodajemy również przypisanie wartości zmiennej a oraz niezbędne biblioteki i dyrektywy. Dzięki temu możesz uruchomić je w środowisku programistycznym. Przetestujemy rozwiązanie dla a = 140.
Przykładowe rozwiązanie w języku C++:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny.
Linia 3. using namespace std średnik.
Linia 5. int sumadz otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. int suma znak równości 1 średnik.
Linia 7. int i znak równości 2 średnik.
Linia 9. while otwórz nawias okrągły i asterysk i otwórz nawias ostrokątny znak równości n zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. if otwórz nawias okrągły n procent i znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. suma znak równości suma plus i średnik.
Linia 12. if otwórz nawias okrągły n prawy ukośnik i wykrzyknik znak równości i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. suma znak równości suma plus otwórz nawias okrągły n prawy ukośnik i zamknij nawias okrągły średnik.
Linia 14. zamknij nawias klamrowy.
Linia 15. zamknij nawias klamrowy.
Linia 16. i znak równości i plus 1 średnik.
Linia 17. zamknij nawias klamrowy.
Linia 18. return suma średnik.
Linia 19. zamknij nawias klamrowy.
Linia 21. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 22. int a znak równości 140 średnik.
Linia 23. int b znak równości sumadz otwórz nawias okrągły a zamknij nawias okrągły średnik.
Linia 24. int y znak równości sumadz otwórz nawias okrągły b minus 1 zamknij nawias okrągły średnik.
Linia 26. if otwórz nawias okrągły y minus 1 znak równości znak równości a zamknij nawias okrągły otwórz nawias klamrowy.
Linia 27. cout otwórz nawias ostrokątny otwórz nawias ostrokątny b minus 1 średnik.
Linia 28. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 29. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów NIE cudzysłów średnik.
Linia 30. zamknij nawias klamrowy.
Linia 31. zamknij nawias klamrowy.
Przykładowe rozwiązanie w języku Java:
Linia 1. public class Main otwórz nawias klamrowy.
Linia 3. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. int a znak równości 140 średnik.
Linia 5. int b znak równości sumadz otwórz nawias okrągły a zamknij nawias okrągły średnik.
Linia 6. int y znak równości sumadz otwórz nawias okrągły b minus 1 zamknij nawias okrągły średnik.
Linia 8. if otwórz nawias okrągły y minus 1 znak równości znak równości a zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. System kropka out kropka println otwórz nawias okrągły b minus 1 zamknij nawias okrągły średnik.
Linia 10. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów NIE cudzysłów zamknij nawias okrągły średnik.
Linia 12. zamknij nawias klamrowy.
Linia 13. zamknij nawias klamrowy.
Linia 15. static int sumadz otwórz nawias okrągły int n zamknij nawias okrągły otwórz nawias klamrowy.
Linia 16. int suma znak równości 1 średnik.
Linia 17. int i znak równości 2 średnik.
Linia 19. while otwórz nawias okrągły i asterysk i otwórz nawias ostrokątny znak równości n zamknij nawias okrągły otwórz nawias klamrowy.
Linia 20. if otwórz nawias okrągły n procent i znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 21. suma znak równości suma plus i średnik.
Linia 22. if otwórz nawias okrągły n prawy ukośnik i wykrzyknik znak równości i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 23. suma znak równości suma plus otwórz nawias okrągły n prawy ukośnik i zamknij nawias okrągły średnik.
Linia 24. zamknij nawias klamrowy.
Linia 25. zamknij nawias klamrowy.
Linia 26. i znak równości i plus 1 średnik.
Linia 27. zamknij nawias klamrowy.
Linia 28. return suma średnik.
Linia 29. zamknij nawias klamrowy.
Linia 30. zamknij nawias klamrowy.
Przykładowe rozwiązanie w języku Python:
Linia 1. def sumadz otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 2. suma znak równości 1.
Linia 3. i znak równości 2.
Linia 4. while i asterysk i otwórz nawias ostrokątny znak równości n dwukropek.
Linia 5. if n procent i znak równości znak równości 0 dwukropek.
Linia 6. suma znak równości suma plus i.
Linia 7. if n prawy ukośnik prawy ukośnik i wykrzyknik znak równości i dwukropek.
Linia 8. suma znak równości suma plus otwórz nawias okrągły n prawy ukośnik prawy ukośnik i zamknij nawias okrągły.
Linia 9. i znak równości i plus 1.
Linia 10. return suma.
Linia 12. a znak równości 140.
Linia 13. b znak równości sumadz otwórz nawias okrągły a zamknij nawias okrągły.
Linia 14. y znak równości sumadz otwórz nawias okrągły b minus 1 zamknij nawias okrągły.
Linia 15. if y minus 1 znak równości znak równości a dwukropek.
Linia 16. print otwórz nawias okrągły b minus 1 zamknij nawias okrągły.
Linia 17. else dwukropek.
Linia 18. print otwórz nawias okrągły cudzysłów NIE cudzysłów zamknij nawias okrągły.
Schemat oceniania
4 pkt – za poprawny algorytm, w tym:
3 pkt – za poprawne obliczanie sumy dzielników zadanej liczby (lub potencjalnej liczby skojarzonej):
1 pkt – za sumowanie kolejnych dzielników,
1 pkt – za poprawną konstrukcję pętli,
1 pkt – za algorytm o złożoności nie gorszej niż ݊√,
1 pkt – za poprawne ustalenie liczby b oraz za sprawdzenie, czy liczby a i b są skojarzone,