Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program PowerOfTwo;
- uses
- System.SysUtils;
- type
- BigInteger = array of Byte;
- ComparisonSign = (Less, Equal, Greater);
- const
- ValidDigits = ['0' .. '9'];
- MaxNumValue = 1000;
- MinNumValue = 0;
- NumberToPower = 2;
- Base = 10;
- function GetDigit(const Number: BigInteger; const I: Integer): Byte;
- var
- Answer: Byte;
- begin
- if (Low(Number) <= I) and (I <= High(Number)) then
- Answer := Number[I]
- else
- Answer := 0;
- GetDigit := Answer;
- end;
- function IsCorrectNumber(const StringToCheck: String): Boolean;
- var
- I: Integer;
- Digit: Char;
- IsCorrect: Boolean;
- begin
- IsCorrect := True;
- for I := Low(StringToCheck) to Length(StringToCheck) do
- begin
- Digit := StringToCheck[I];
- if not (Digit in ValidDigits) then
- IsCorrect := False;
- end;
- IsCorrectNumber := IsCorrect;
- end;
- function ConvertToBigInteger(const StringToParse: String): BigInteger;
- var
- DigitValue: Byte;
- I: Integer;
- Answer: BigInteger;
- begin
- SetLength(Answer, Length(StringToParse));
- for I := Low(StringToParse) to High(StringToParse) do
- begin
- DigitValue := Ord(StringToParse[I]) - Ord('0');
- Answer[High(StringToParse) - I] := DigitValue;
- end;
- ConvertToBigInteger := Answer;
- end;
- function ConvertToString(const Number: BigInteger): String;
- var
- Answer: String;
- I: Integer;
- begin
- Answer := '';
- for I := High(Number) downto Low(Number) do
- Answer := Answer + Chr(Number[I] + Ord('0'));
- ConvertToString := Answer;
- end;
- function MultiplyByInteger(const A: BigInteger;
- const B: Integer): BigInteger;
- var
- Answer: BigInteger;
- Temp, Carry, I: Integer;
- begin
- SetLength(Answer, 0);
- I := 0;
- Carry := 0;
- while (Carry > 0) or (I < Length(A)) do
- begin
- SetLength(Answer, Length(Answer) + 1);
- Temp := GetDigit(A, I) * B + Carry;
- Answer[I] := Temp mod Base;
- Carry := Temp div Base;
- Inc(I);
- end;
- MultiplyByInteger := Answer;
- end;
- function Sum(const A, B: BigInteger): BigInteger;
- var
- I, Carry, Temp: Integer;
- Answer: BigInteger;
- begin
- SetLength(Answer, 0);
- I := 0;
- Carry := 0;
- while (Carry > 0) or (I < Length(A)) or (I < Length(B)) do
- begin
- SetLength(Answer, Length(Answer) + 1);
- Temp := GetDigit(A, I) + GetDigit(B, I) + Carry;
- Answer[I] := Temp mod Base;
- Carry := Temp div Base;
- Inc(I);
- end;
- Sum := Answer;
- end;
- function Multiply(const A: BigInteger; B: BigInteger): BigInteger;
- var
- I: Integer;
- Multiplier, Answer: BigInteger;
- begin
- Multiplier := Copy(B, Low(B), Length(B));
- Answer := ConvertToBigInteger('0');
- for I := Low(A) to High(A) do
- begin
- Answer := Sum(Answer, MultiplyByInteger(Multiplier, A[I]));
- Multiplier := MultiplyByInteger(Multiplier, Base);
- end;
- Multiply := Answer;
- end;
- function ReadInteger(const Prompt: String;
- const LowRange, HighRange: Integer): Integer;
- var
- IsCorrect: Boolean;
- Value: Integer;
- begin
- {$I-}
- repeat
- IsCorrect := True;
- Writeln(Format(
- Prompt + ' from %d to %d.',
- [LowRange, HighRange]));
- Readln(Value);
- if IOResult <> 0 then
- begin
- Writeln('Input is not a number.');
- IsCorrect := False;
- end
- else if (Value < LowRange) or (HighRange < Value) then
- begin
- Writeln('Number is not in range.');
- Writeln(Format(
- 'Number must be from %d to %d.',
- [LowRange, HighRange]));
- IsCorrect := False;
- end;
- if not IsCorrect then
- Writeln('Try again.');
- until IsCorrect;
- {$I+}
- ReadInteger := Value;
- end;
- function Power(const Base: BigInteger; Exponent: Integer): BigInteger;
- var
- Answer: BigInteger;
- CurrPower: BigInteger;
- begin
- Answer := ConvertToBigInteger('1');
- CurrPower := Copy(Base, Low(Base), Length(Base));
- while Exponent <> 0 do
- begin
- if (Exponent and 1) = 1 then
- Answer := Multiply(Answer, CurrPower);
- CurrPower := Multiply(CurrPower, CurrPower);
- Exponent := Exponent shr 1;
- end;
- Power := Answer;
- end;
- procedure Main;
- var
- Exponent: Integer;
- Answer, BigNumberToPower: BigInteger;
- begin
- Exponent := ReadInteger('Enter exponent to calculate 2^x',
- MinNumValue, MaxNumValue);
- BigNumberToPower := ConvertToBigInteger(
- IntToStr(NumberToPower));
- Answer := Power(BigNumberToPower, Exponent);
- Writeln(Format('2 ^ %d = %s',
- [Exponent, ConvertToString(Answer)]));
- Readln;
- end;
- begin
- Main;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement