System dziesiętny na jedenastkowy.

0

Witajcie. Szukam, szukam i mało się dowiedziałem jak zamienić system dziesiętny na jedenastkowy. Póki co dysponuje taką wiedzą:
np.
s. dziesiętny: 1263
s. jedenastk: A49

Wiem, że muszę odejmować resztę z dzielenia przez 11.
1263 / 11 = 114 r. 9 (mamy pierwszą cyfrę od prawej)
1263 - 9 = 1254
1254 / 11 = 114 r. 0 (i co teraz mam zrobić?)

0

Szukam, szukam i mało się dowiedziałem jak zamienić system dziesiętny na jedenastkowy
Tak samo jak byś zamienił na szesnastkowy, tylko masz mniejszą podstawę ;p

0

Z każdego na każdy: http://4programmers.net/Forum/1005274

0

napisałem coś takiego dla samego zamieniania dec na jedenastkowy i szesnastkowy:

#include <iostream>
using namespace std;

void f_Sys(int liczba, char *tab, int system){
        if(liczba == 0){
            tab[0] = '0';
            tab[1] = 0;
            return;
        }
        char out[]="0123456789ABCDEF";
        int tSize = 0;
        int reszta;
        while(liczba != 0)
        {
            reszta = liczba % system;
            liczba = liczba / system;
            tab[tSize] = out[reszta];
            ++tSize;
        }
        tab[tSize] = 0;
}

int main()
{
    int T;
    for(cin>>T; T>0; --T)
    {
        int L;
        cin >> L;
        char text[20];
        f_To11(L, text, 16);
        cout<<text<<" ";
        f_To11(L, text, 11);
        cout<<text<<endl;
    }
    return 0;
} 

Niestety coś jest nie tak. Dla pewnych wartości działa poprawnie, dla niektórych nie : /

1
        int reszta;
        while(liczba != 0)
        {
            reszta = liczba % system;
            liczba = liczba / system;
            tab[tSize] = out[reszta];
            ++tSize;
        }

=

for(;(liczba)||(!tSize);liczba/=system) tab[tSize++]=out[liczba%system];

no prawie równe, to drugie poprawnie zadziała dla wartości 0 więc eliminuje kolejne 5 wierszy twego kodu.

0
for(int it=0; it<tSize/2; ++it)
 swap(tab[it], tab[tSize-1-it]);
 

Zapomniałem wypisać znaki w odwrotnej kolejności =.= Teraz spróbuję przepisać tę Twoja magiczną linię czarów i zobaczę co i jak.

0

@_13th_Dragon sprawdziłem i działa super, tylko dalej nie mogę wykminić, po co w warunku sprawdzającym pętle jest ||(!tSize) ?

        for(;(liczba)||(!tSize); liczba /= system)
            tab[tSize++] = out[liczba%system];
        tab[tSize] = 0;
        for(int it=0; it<tSize/2; ++it)
            swap(tab[it], tab[tSize-1-it]); 
1
gswidwa napisał(a):
for(int it=0; it<tSize/2; ++it)
 swap(tab[it], tab[tSize-1-it]);

dzielenie na każdym kroku pętli? Genialne! Owszem wynajęta sprzątaczka, więc kloce na korytarzu nikomu nie przeszkadzają ...

for(int p=0,k=tSize;p<k;++p)  swap(tab[p],tab[--k]);
gswidwa napisał(a):

@_13th_Dragon sprawdziłem i działa super, tylko dalej nie mogę wykminić, po co w warunku sprawdzającym pętle jest ||(!tSize) ?
Po to aby wywalić to:

         if(liczba == 0){
            tab[0] = '0';
            tab[1] = 0;
            return;
        }

Jeżeli już oszczędzamy na wierszach to mi wychodzi tyle:
Uwaga jest to złe podejście do sprawy:

#include <algorithm>
#include <iostream>
using namespace std;
 
char *conv(unsigned val,unsigned sys,char *end)
  {
   static const char digit[]="0123456789ABCDEF";
   char *save=end;
   for(*end=0;(val)||(save==end);val/=sys) *(--end)=digit[val%sys];
   return end;
  }
 
int main()
  {
   char buf[33];
   unsigned T,val;
   for(cin>>T;T--;cout<<conv(val,16,buf+16)<<' '<<conv(val,11,buf+32)<<'\n') cin>>val;
   return 0;
  }

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