Dziesiętna dodatnia liczba całkowita n jest p-podobna, gdzie p jest liczbą całkowitą i 2 ≤ p ≤ 10, jeśli suma jej cyfr jest równa sumie jej cyfr w reprezentacji przy podstawie p. Jedna i druga suma są obliczane w systemie dziesiętnym. Na przykład,
Liczba 21 jest 2-podobna, bo 21 = (10101)2 i 2 + 1 = 1 + 0 + 1 + 0 + 1 = 3 Liczba 23 jest 3-podobna, bo 23 = (212)3 i 2 + 3 = 2 + 1 + 2 = 5
Zauważ, że każda liczba n jest 10-podobna, bo np. 57 = (57)10 a) Podaj specyfikację problemu, polegającego na sprawdzeniu, czy dla danych dwóch liczb n i p spełniających powyższe warunki, liczba n jest p-podobna.
b) Opisz algorytm i zapisz w wybranym przez siebie języku programowania, dla specyfikacji podanej w części a).
W C++
luke14444
/* specyfkacja: n liczba dodatnia naturalna i n <= 1000000000 * p liczba dodatnia naturalna i p >=2 i p <=10 * ograniczenie na n jest zwiazane z ograniczeniem typu int, dla uproszczenia liczbe zaokraglono do potegi liczby 10
problem: odpowiedz na pytanie, czy n jest p-podobne, gdzie n jest p-podobne jezeli sumy cyfr reprezantacji w liczby n w systemie 10 i w systemie p sa takie same (sumy liczone w systemie 10) np: Liczba 21 jest 2-podobna, bo 21 = (10101)2 i 2 + 1 = 1 + 0 + 1 + 0 + 1 = 3 Liczba 23 jest 3-podobna, bo 23 = (212)3 i 2 + 3 = 2 + 1 + 2 = 5
wynikiem dzialania programu jest liczba typu bool, czy_n_p_podone, ktorej wartosc jest: true = jezeli n jest p-podobne false = jezeli n nie jest p-podobne
dzialanie programu polega na policzeniu sumy cyfr reprezentacji liczby n w systemach o podstawie 10 i p, i porownaniu sum
zliczanie sumy cyfr liczby w repreznetacji o zadanej podstawie realizuje funkcja suma_cyfr(int,int) pierwszy argument, typu int, wartosc liczba drugi argument, typu int, wartosc podstawy systemu liczenia funkcja zwraca sume cyfr reprezentacji liczby (pierwszy argument) w systmie liczenia o zadane podstawie (drugi argument)
opis dzialania funkcji suma_cyfr: jezeli wartosc liczby (pierwszy argument) jest 0 lub mniej, funkcja zwraca 0. jezeli wartosc liczby jest wieksza od 0, to w kolejnych iteracjach petli zliczane sa kolejne cyfry reprezentacji liczby w systemie o zadanej postawie (drugi argument) w pierwszej iteracji obliczana jest cyfra pierwsza od prawej w drugiej iteracji druga od prawej itd. pierwsza od prawej cyfra jest rowna liczba % podstawa (reszta z dzielenia liczby przez podstawe) np: jezeli liczba = 1234 a postawa = 10, to 1234 % 10 = 4 nastepnie, dla ustalenie kolejnej cyfry: ostania cyfra w liczbie jest odcinana przez zastosowanie obliczania liczba = liczba / podstawa (czesc calkowita z dzielenia liczby przez podstawe) np: jezeli liczba = 1234, a podstawa = 10, to 1234 / 10 = 123 zatem w kolejnym kroku iteracji zostanie obliczona druga cyfra od prawej itd. algorytm zakonczy sie, bo jezeli liczba > 0 i potega > 0, to liczba/potega >= 0, oraz liczba > liczba / potega
*/
#include <iostream>
int suma_cyfr(int liczba, int podstawa) { int suma = 0; while (liczba > 0) { suma += liczba % podstawa; liczba = liczba / podstawa; } return suma; }
specyfkacja:
n liczba dodatnia naturalna i n <= 1000000000 *
p liczba dodatnia naturalna i p >=2 i p <=10
* ograniczenie na n jest zwiazane z ograniczeniem typu int,
dla uproszczenia liczbe zaokraglono do potegi liczby 10
problem: odpowiedz na pytanie, czy n jest p-podobne,
gdzie n jest p-podobne jezeli sumy cyfr reprezantacji
w liczby n w systemie 10 i w systemie p sa takie same
(sumy liczone w systemie 10)
np:
Liczba 21 jest 2-podobna, bo 21 = (10101)2 i 2 + 1 = 1 + 0 + 1 + 0 + 1 = 3
Liczba 23 jest 3-podobna, bo 23 = (212)3 i 2 + 3 = 2 + 1 + 2 = 5
wynikiem dzialania programu jest liczba typu bool,
czy_n_p_podone, ktorej wartosc jest:
true = jezeli n jest p-podobne
false = jezeli n nie jest p-podobne
dzialanie programu polega na policzeniu sumy cyfr
reprezentacji liczby n w systemach o podstawie 10 i p,
i porownaniu sum
zliczanie sumy cyfr liczby w repreznetacji o zadanej podstawie realizuje funkcja
suma_cyfr(int,int)
pierwszy argument, typu int, wartosc liczba
drugi argument, typu int, wartosc podstawy systemu liczenia
funkcja zwraca sume cyfr reprezentacji liczby (pierwszy argument)
w systmie liczenia o zadane podstawie (drugi argument)
opis dzialania funkcji suma_cyfr:
jezeli wartosc liczby (pierwszy argument) jest 0 lub mniej, funkcja zwraca 0.
jezeli wartosc liczby jest wieksza od 0, to w kolejnych iteracjach petli
zliczane sa kolejne cyfry reprezentacji liczby w systemie o zadanej
postawie (drugi argument)
w pierwszej iteracji obliczana jest cyfra pierwsza od prawej
w drugiej iteracji druga od prawej itd.
pierwsza od prawej cyfra jest rowna liczba % podstawa
(reszta z dzielenia liczby przez podstawe)
np: jezeli liczba = 1234 a postawa = 10, to 1234 % 10 = 4
nastepnie, dla ustalenie kolejnej cyfry:
ostania cyfra w liczbie jest odcinana przez zastosowanie obliczania liczba = liczba / podstawa
(czesc calkowita z dzielenia liczby przez podstawe)
np: jezeli liczba = 1234, a podstawa = 10, to 1234 / 10 = 123
zatem w kolejnym kroku iteracji zostanie obliczona druga cyfra od prawej
itd.
algorytm zakonczy sie, bo
jezeli liczba > 0 i potega > 0, to liczba/potega >= 0,
oraz liczba > liczba / potega
*/
#include <iostream>
int suma_cyfr(int liczba, int podstawa)
{
int suma = 0;
while (liczba > 0)
{
suma += liczba % podstawa;
liczba = liczba / podstawa;
}
return suma;
}
int main()
{
int n = 1234;
int p = 2;
bool czy_n_p_podobne = (suma_cyfr(n, 10) == suma_cyfr(n, p));
return 0;
}