Konwersja systemów liczbowych
Z racji ciągłych powtarzających sie pytań. Przykład algorytmu. Jeżeli kompilator odrzuca strlwr(), to trzeba zmienić małe literki w digit na wielkie (ja po prostu lubie małe) i zamienić strlwr() na strupr(), albo napisać swoje.
// kompilowane na borlandzie
#include <stdio.h>
#include <math.h>
#include <string.h>
char const * const digit="0123456789abcdefghijklmnopqrstuvwxyz";
char* strn(unsigned long liczba,char podstawa){
static char wynik[33]; // 32 bity + 0
char i=1+log(liczba)/log(podstawa);
wynik[i]=0;
while(i--){
wynik[i]=digit[liczba%podstawa];
liczba/=podstawa;
}
return wynik;
}
unsigned long val(char* znaki,unsigned char podstawa,unsigned char& error){
// val - znasz to z tp
unsigned long w=0; // w jak wynik
char* zn=new char[strlen(znaki)+1];
strcpy(zn,znaki); // zeby nie zmieniac ciagu wejsciowego
strlwr(zn); // lower case, bo digit to male cyferki
for(unsigned char i=0;zn[i];i++){
w*=podstawa;
error=(strchr(digit,zn[i])-digit);
if(error>=podstawa){
error=1+i;
break;
}
w+=error;
error=0;
}
delete zn;
return w;
}
int main(){
unsigned char i,err;
unsigned long wynik;
for(i=2;i<20;i++){
wynik=val("345",i,err);
printf("podstawa: %d error: %d ",i,err); // err-1 znak jest bledny
if(!err)printf("string: %s value: %d \n",strn(wynik,10),wynik);
else printf("\n");
}
return 0;
}
mam wrażenie, że to już było...
Jasne, ale jeszcze nie w faq, a nie chce mi się ciągle szukać tego linku
Coś jakby podobne do tego
http://4programmers.net/view.php?id=417
Tylko w C