home *** CD-ROM | disk | FTP | other *** search
- { Three ways to find the BASE of a number }
-
-
- function base2l(strin: string; base: byte): longint;
-
- { converts a string containing a "number" in another base into a decimal
- longint }
-
- var cnter, len: byte;
- dummylint: longint;
- seendigit, negatize: boolean;
- begalpha, endalpha, thschr: char;
- begin
- dummylint := 0;
- begalpha := char(65);
- endalpha := char(64 + base - 10);
- negatize := false;
- seendigit := false;
- len := length(strin);
- cnter := 1;
-
- { the following loop processes each character }
-
- while cnter <= len do begin
- thschr := upcase(strin[cnter]);
- case thschr of
- '-': if seendigit then cnter := len else negatize := true;
-
- { if we haven't seen any "digits" yet, it'll be a negative
- number; otherwise the hyphen is an extraneous character so
- we're done processing the string }
-
- '0' .. '9': if byte(thschr) - 48 < base then begin
- dummylint := base*dummylint + byte(thschr) - 48;
- seendigit := true;
- end
- else cnter := len;
-
- { 0-9: if the base supports the digit, use it; otherwise,
- it's an extraneous character and we're done }
-
- ' ': if seendigit then cnter := len;
-
- { space: if we've already encountered some digits, we're done }
-
- else begin
-
- { all other characters }
-
- if (thschr >= begalpha) and (thschr <= endalpha) then
-
- { an acceptable character for this base }
-
- dummylint := base*dummylint + byte(thschr) - 65 + 10
- else
-
- { not acceptabe: we're done }
-
- cnter := len;
- end;
- end;
- cnter := cnter + 1;
- end;
- if negatize then dummylint := -dummylint;
- base2l := dummylint;
- end;
-
- {Another way:}
-
- function l2base(numin: longint; base, numplaces: byte; leadzero: boolean): string;
-
- { Converts a longint into a string representing the number in another base.
- Numin = the longint; base = base; numplaces is how many characters the answer
- should go in; leadzero indicates whether to put leading zeros. }
-
- var tmpstr: string;
- remainder, cnter, len: byte;
- negatize: boolean;
- begin
- negatize := (numin < 0);
- if negatize then numin := abs(numin);
-
- { assign number of places in string }
-
- tmpstr[0] := char(numplaces);
- len := numplaces;
-
- { now fill those places from right to left }
-
- while numplaces > 0 do begin
- remainder := numin mod base;
- if remainder > 9 then
- tmpstr[numplaces] := char(remainder + 64 - 9)
- else
- tmpstr[numplaces] := char(remainder + 48);
- numin := numin div base;
- numplaces := numplaces - 1;
- end;
-
- { not enough room assigned: fill with asterisks }
-
- if (numin <> 0) or (negatize and (tmpstr[1] <> '0')) then
- for numplaces := 1 to byte(tmpstr[0]) do tmpstr[numplaces] := '*';
-
- { put in minus sign }
-
- if leadzero then begin
- if negatize and (tmpstr[1] = '0') then tmpstr[1] := '-'
- end
- else begin
- cnter := 1;
- while (cnter < len) and (tmpstr[cnter] = '0') do begin
- tmpstr[cnter] := ' ';
- cnter := cnter + 1;
- end;
- if negatize and (cnter > 1) then tmpstr[cnter - 1] := '-';
- end;
- l2base := tmpstr;
- end;
-
- { Yet another way }
-
- Program ConvertBase;
-
- Procedure UNTESTEDConvertBase(BaseN:Byte; BaseNNumber:String;
- BaseZ:Byte; var BaseZNumber:String);
-
- var
- I: Integer;
- Number,Remainder: LongInt;
-
- begin
- Number := 0;
- for I := 1 to Length (BaseNNumber) do
- case BaseNNumber[I] of
- '0'..'9': Number := Number * BaseN + Ord (BasenNumber[I]) - Ord ('0');
- 'A'..'Z': Number := Number * BaseN + Ord (BasenNumber[I]) -
- Ord ('A') + 10;
- 'a'..'z': Number := Number * BaseN + Ord (BasenNumber[I]) -
- Ord ('a') + 10;
- end; BaseZNumber := ''; while Number > 0 do
- begin
- Remainder := Number mod BaseZ;
- Number := Number div BaseZ;
- case Remainder of
- 0..9: BaseZNumber := Char (Remainder + Ord ('0')) + BaseZNumber;
- 10..36: BaseZNumber := Char (Remainder - 10 + Ord ('A')) + BaseZNumber;
- end;
-
- end; end;
-
-
- var BaseN,BaseZ:Byte;
- BaseNNumber,
- BaseZNumber:String;
-
- Begin
-
- Write(' BASE N > ');
- Readln(BaseN);
- Write(' NUMBER N> ');
- Readln(BaseNNumber);
- Write(' BASE Z > ');
- Readln(BaseZ);
- Write(' NUMBER Z> ');
- UntestedConvertBase(BaseN,BaseNNumber,BaseZ,BaseZNumber);
- Writeln(BaseZNumber);
- Readln;
- end.