Advertisement
Guest User

BigInt

a guest
Nov 22nd, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.61 KB | None | 0 0
  1. program PowerOfTwo;
  2.  
  3. uses
  4.    System.SysUtils;
  5.  
  6. type
  7.    BigInteger = array of Byte;
  8.    ComparisonSign = (Less, Equal, Greater);
  9.  
  10. const
  11.    ValidDigits = ['0' .. '9'];
  12.    MaxNumValue = 1000;
  13.    MinNumValue = 0;
  14.    NumberToPower = 2;
  15.    Base = 10;
  16.  
  17. function GetDigit(const Number: BigInteger; const I: Integer): Byte;
  18. var
  19.    Answer: Byte;
  20. begin
  21.    if (Low(Number) <= I) and (I <= High(Number)) then
  22.       Answer := Number[I]
  23.    else
  24.       Answer := 0;
  25.    GetDigit := Answer;
  26. end;
  27.  
  28. function IsCorrectNumber(const StringToCheck: String): Boolean;
  29. var
  30.    I: Integer;
  31.    Digit: Char;
  32.    IsCorrect: Boolean;
  33. begin
  34.    IsCorrect := True;
  35.    for I := Low(StringToCheck) to Length(StringToCheck) do
  36.    begin
  37.       Digit := StringToCheck[I];
  38.       if not (Digit in ValidDigits) then
  39.          IsCorrect := False;
  40.    end;
  41.    IsCorrectNumber := IsCorrect;
  42. end;
  43.  
  44. function ConvertToBigInteger(const StringToParse: String): BigInteger;
  45. var
  46.    DigitValue: Byte;
  47.    I: Integer;
  48.    Answer: BigInteger;
  49. begin
  50.    SetLength(Answer, Length(StringToParse));
  51.  
  52.    for I := Low(StringToParse) to High(StringToParse) do
  53.    begin
  54.       DigitValue := Ord(StringToParse[I]) - Ord('0');
  55.       Answer[High(StringToParse) - I] := DigitValue;
  56.    end;
  57.  
  58.    ConvertToBigInteger := Answer;
  59. end;
  60.  
  61. function ConvertToString(const Number: BigInteger): String;
  62. var
  63.    Answer: String;
  64.    I: Integer;
  65. begin
  66.    Answer := '';
  67.    for I := High(Number) downto Low(Number) do
  68.       Answer := Answer + Chr(Number[I] + Ord('0'));
  69.    ConvertToString := Answer;
  70. end;
  71.  
  72. function MultiplyByInteger(const A: BigInteger;
  73.    const B: Integer): BigInteger;
  74. var
  75.    Answer: BigInteger;
  76.    Temp, Carry, I: Integer;
  77. begin
  78.    SetLength(Answer, 0);
  79.    I := 0;
  80.    Carry := 0;
  81.  
  82.    while (Carry > 0) or (I < Length(A)) do
  83.    begin
  84.       SetLength(Answer, Length(Answer) + 1);
  85.       Temp := GetDigit(A, I) * B + Carry;
  86.       Answer[I] := Temp mod Base;
  87.       Carry := Temp div Base;
  88.       Inc(I);
  89.    end;
  90.  
  91.    MultiplyByInteger := Answer;
  92. end;
  93.  
  94. function Sum(const A, B: BigInteger): BigInteger;
  95. var
  96.    I, Carry, Temp: Integer;
  97.    Answer: BigInteger;
  98. begin
  99.    SetLength(Answer, 0);
  100.    I := 0;
  101.    Carry := 0;
  102.  
  103.    while (Carry > 0) or (I < Length(A)) or (I < Length(B)) do
  104.    begin
  105.       SetLength(Answer, Length(Answer) + 1);
  106.       Temp := GetDigit(A, I) + GetDigit(B, I) + Carry;
  107.       Answer[I] := Temp mod Base;
  108.       Carry := Temp div Base;
  109.       Inc(I);
  110.    end;
  111.  
  112.    Sum := Answer;
  113. end;
  114.  
  115. function Multiply(const A: BigInteger; B: BigInteger): BigInteger;
  116. var
  117.    I: Integer;
  118.    Multiplier, Answer: BigInteger;
  119. begin
  120.    Multiplier := Copy(B, Low(B), Length(B));
  121.    Answer := ConvertToBigInteger('0');
  122.  
  123.    for I := Low(A) to High(A) do
  124.    begin
  125.       Answer := Sum(Answer, MultiplyByInteger(Multiplier, A[I]));
  126.       Multiplier := MultiplyByInteger(Multiplier, Base);
  127.    end;
  128.  
  129.    Multiply := Answer;
  130. end;
  131.  
  132. function ReadInteger(const Prompt: String;
  133.    const LowRange, HighRange: Integer): Integer;
  134. var
  135.    IsCorrect: Boolean;
  136.    Value: Integer;
  137. begin
  138.    {$I-}
  139.    repeat
  140.       IsCorrect := True;
  141.  
  142.       Writeln(Format(
  143.          Prompt + ' from %d to %d.',
  144.          [LowRange, HighRange]));
  145.       Readln(Value);
  146.  
  147.       if IOResult <> 0 then
  148.       begin
  149.          Writeln('Input is not a number.');
  150.          IsCorrect := False;
  151.       end
  152.       else if (Value < LowRange) or (HighRange < Value) then
  153.       begin
  154.          Writeln('Number is not in range.');
  155.          Writeln(Format(
  156.             'Number must be from %d to %d.',
  157.             [LowRange, HighRange]));
  158.          IsCorrect := False;
  159.       end;
  160.       if not IsCorrect then
  161.          Writeln('Try again.');
  162.    until IsCorrect;
  163.    {$I+}
  164.    ReadInteger := Value;
  165. end;
  166.  
  167. function Power(const Base: BigInteger; Exponent: Integer): BigInteger;
  168. var
  169.    Answer: BigInteger;
  170.    CurrPower: BigInteger;
  171. begin
  172.    Answer := ConvertToBigInteger('1');
  173.    CurrPower := Copy(Base, Low(Base), Length(Base));
  174.  
  175.    while Exponent <> 0 do
  176.    begin
  177.       if (Exponent and 1) = 1 then
  178.          Answer := Multiply(Answer, CurrPower);
  179.       CurrPower := Multiply(CurrPower, CurrPower);
  180.       Exponent := Exponent shr 1;
  181.    end;
  182.  
  183.    Power := Answer;
  184. end;
  185.  
  186. procedure Main;
  187. var
  188.    Exponent: Integer;
  189.    Answer, BigNumberToPower: BigInteger;
  190. begin
  191.    Exponent := ReadInteger('Enter exponent to calculate 2^x',
  192.       MinNumValue, MaxNumValue);
  193.    BigNumberToPower := ConvertToBigInteger(
  194.       IntToStr(NumberToPower));
  195.    Answer := Power(BigNumberToPower, Exponent);
  196.    Writeln(Format('2 ^ %d = %s',
  197.       [Exponent, ConvertToString(Answer)]));
  198.    Readln;
  199. end;
  200.  
  201. begin
  202.    Main;
  203. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement