[C++] algorytm układu pozycyjnego

Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] algorytm układu pozycyjnego

Post autor: alchem »

Opracuj algorytm i napisz funkcję, która dla zadanej liczby całkowitej nieujemnej, podstawy układu liczenia oraz wykładnika zwróci stosowny współczynnik w zapisie wartości tej liczby w układzie pozycyjnym o zadanej podstawie. Np. dla liczby \(\displaystyle{ 17}\), podstawy \(\displaystyle{ 10}\) i wykładnika \(\displaystyle{ 1}\) odpowiedzią jest oczywiście\(\displaystyle{ 1}\). Dla liczby \(\displaystyle{ 254}\), podstawy \(\displaystyle{ 16}\) i wykładnika \(\displaystyle{ 0}\) odpowiedzią jest \(\displaystyle{ 14}\), ponieważ \(\displaystyle{ 254=15 \cdot 16^1+14 \cdot 16^0}\).
Jedyne co zrobiłem to to:

Kod: Zaznacz cały

#include <iostream>
#include <math.h>

using namespace std;
int funkcja(int liczba, int podstawa, int wykladnik );
int main()
{
    cout << "Witaj" <<endl;
    cout << "Podaj liczbe: ";
    int licz;
    cin >> licz;
    cout <<"Podaj podstawe ukladu liczenia: " ;
    int podst;
    cin >> podst;
    cout <<"Podaj o jaki wykladnik Ci chodzi: ";
    int wykl;
    cin>>wykl;
    funkcja( licz , podst , wykl );

}


int funkcja(int liczba, int podstawa, int wykladnik )
{
 int i = podstawa;


 while(podstawa <= liczba)
 {
     podstawa=i*podstawa;
 }
    int k=podstawa/i;
    cout <<k<<endl;
  






}
Więc program obliczy tylko podstawe do największego możliwego wykładnika, ale nic poza tym.
Próbowałem pisać tą fukcje dalej, ale niestety nie wiem do końca jak, a jedyny mój pomysł jest strasznie zaplątany.
Ma ktoś pomysł jak taki algorytm powinien wyglądać?
Ostatnio zmieniony 26 mar 2016, o 15:02 przez Afish, łącznie zmieniany 1 raz.
Powód: Symbol mnożenia to \cdot.
Andreas
Użytkownik
Użytkownik
Posty: 1130
Rejestracja: 1 lis 2008, o 22:33
Płeć: Mężczyzna
Podziękował: 72 razy
Pomógł: 156 razy

[C++] algorytm układu pozycyjnego

Post autor: Andreas »

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int wspolczynnik (int liczba, int podstawa, int wykladnik)
{
    int wynik=0;
    while (wykladnik >= 0)
    {
        wynik = liczba%podstawa;
        liczba = liczba/podstawa;
        wykladnik--;
    }
    return wynik;
}

int main()
{
    cout << wspolczynnik(254, 16, 0);
    return 0;
}
Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] algorytm układu pozycyjnego

Post autor: alchem »

Nie za bardzo rozumiem dlaczego w 10 linii kodu mamy :

Kod: Zaznacz cały

liczba = liczba/podstawa;
.
Patrzałem na przykładach ale jakoś tego nie widzę :/ Możesz to wytłumaczyć?
Tak czy siak, widzac w Twoim kodzie to modulo o ktorym wcześniej nie wiedzieć czemu nie pomyslałem napisałem swój kod, podobny do Twojego.

Kod: Zaznacz cały

int funkcja(int liczba, int podstawa, int wykladnik )
{ int wynik = 0;
const  int k = podstawa;
 while(wykladnik>=0)
 {

   wynik = (liczba%podstawa)*k/podstawa;
   liczba = liczba-(liczba%podstawa);
   podstawa=k*podstawa;
   wykladnik--;

 }

return wynik;

}
-- 26 mar 2016, o 14:19 --

W 7 linii jest:

Kod: Zaznacz cały

wynik = (liczba%podstawa)*(k/podstawa);
Okazało się że dopisałem nawiasy dla przejrzystości , tzn prędzej było tak:

Kod: Zaznacz cały

wynik = (liczba%podstawa)*k/podstawa;
I jak się okazało program dla wersji z nawiasami nie działa... wie ktoś dlaczego??
Andreas
Użytkownik
Użytkownik
Posty: 1130
Rejestracja: 1 lis 2008, o 22:33
Płeć: Mężczyzna
Podziękował: 72 razy
Pomógł: 156 razy

[C++] algorytm układu pozycyjnego

Post autor: Andreas »

alchem pisze:Nie za bardzo rozumiem dlaczego w 10 linii kodu mamy :

Kod: Zaznacz cały

liczba = liczba/podstawa;
.
Patrzałem na przykładach ale jakoś tego nie widzę :/ Możesz to wytłumaczyć?
liczba/podstawa obcina ostatnią cyfrę liczby.


Nie rozumiem po co wprowadzasz dodatkową zmienną k i dlaczego zmieniasz podstawę systemu, która jest już dana przy wywołaniu funkcji i już nie będzie się zmieniać?
a4karo
Użytkownik
Użytkownik
Posty: 22210
Rejestracja: 15 maja 2011, o 20:55
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 38 razy
Pomógł: 3755 razy

[C++] algorytm układu pozycyjnego

Post autor: a4karo »

jedna uwaga: \(\displaystyle{ 13}\) i \(\displaystyle{ 14}\) nie sa cyframi w systemie szesnastkowym. Zapisuje sie je [\(\displaystyle{ D}\) i \(\displaystyle{ E}\) odpowiednio
Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] algorytm układu pozycyjnego

Post autor: alchem »

Dlaczego nie będzie się zmieniać?
Stała k ma zwiększać podstawe o "1 potęge", jeśli bym jej nie dał to było by tak że w 1 kroku miałbym np \(\displaystyle{ 10 \cdot 10=100}\), a w drugim \(\displaystyle{ 100 \cdot 100=10000}\), a tak mam \(\displaystyle{ 10 \cdot 100=1000}\)
Np \(\displaystyle{ 1235}\) o podstawie \(\displaystyle{ 10}\)
Po pierwszym kroku wynik to 5
W drugim mam 1230 %(100)=30=wynik i to pomnożone razy 10/podstawe
W czwartym 1000%10000=1000 i to pomnożone razy 10/10000 czyli 1.
W dalszych krokach(jeśli użytkownik poda współczynnik większy od 3) wynik będzie zerem bo liczba=0
Andreas
Użytkownik
Użytkownik
Posty: 1130
Rejestracja: 1 lis 2008, o 22:33
Płeć: Mężczyzna
Podziękował: 72 razy
Pomógł: 156 razy

[C++] algorytm układu pozycyjnego

Post autor: Andreas »

a4karo pisze:jedna uwaga: \(\displaystyle{ 13}\) i \(\displaystyle{ 14}\) nie sa cyframi w systemie szesnastkowym. Zapisuje sie je [\(\displaystyle{ D}\) i \(\displaystyle{ E}\) odpowiednio
Jaki to ma związek z tematem? Ja nic takiego nie napisałem.
a4karo
Użytkownik
Użytkownik
Posty: 22210
Rejestracja: 15 maja 2011, o 20:55
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 38 razy
Pomógł: 3755 razy

[C++] algorytm układu pozycyjnego

Post autor: a4karo »

Opracuj algorytm i napisz funkcję, która dla zadanej liczby całkowitej nieujemnej, podstawy układu liczenia oraz wykładnika zwróci stosowny współczynnik w zapisie wartości tej liczby w układzie pozycyjnym o zadanej podstawie. Np. dla liczby 17, podstawy 10 i wykładnika 1 odpowiedzią jest oczywiście1. Dla liczby 254, podstawy 16 i wykładnika 0 odpowiedzią jest 14, ponieważ \(\displaystyle{ 254=15 \cdot 16^1+14 \cdot 16^0.}\)
Czyżbym znów nie doczytał? Ten stosowny współczynnik w zapisie wartości tej liczby nazywa sie cyfrą i w zapisie szesnastkowym \(\displaystyle{ 254_{16}=FE}\)
Andreas
Użytkownik
Użytkownik
Posty: 1130
Rejestracja: 1 lis 2008, o 22:33
Płeć: Mężczyzna
Podziękował: 72 razy
Pomógł: 156 razy

[C++] algorytm układu pozycyjnego

Post autor: Andreas »

a4karo, podany poniżej przykład jest częścią polecenia zadania i tam jest podane 14, a nie E.
Wczytanie liczby FE zamiast 254 wymagałoby innych umiejętności niż te, które były widocznie zaplanowane do przećwiczenia przez autora zadania. Nigdzie w poleceniu nie zostało użyte słowo "cyfra" i nie to jest celem zadania, żeby wczytywać i wypisywać liczby w formacie szesnastkowym.
Zarówno ja jak i alchem wiemy co to jest system szesnastkowy i co to jest cyfra, więc twoje uwagi to raczej do autora zadania, nie do nas.
ODPOWIEDZ