program PowerOfTwoDigitSum;
type
TDigitArray = array of Integer;
function PowerOfTwo(N: Integer): TDigitArray;
// Calculate 2^N for large numbers
var
digits: TDigitArray;
i, j, carry, temp: Integer;
begin
SetLength(digits, 1);
digits[0] := 1;
for i := 1 to N do
begin
carry := 0;
for j := 0 to High(digits) do
begin
temp := digits[j] * 2 + carry;
digits[j] := temp mod 10;
carry := temp div 10;
end;
while carry > 0 do
begin
SetLength(digits, Length(digits) + 1);
digits[High(digits)] := carry mod 10;
carry := carry div 10;
end;
end;
PowerOfTwo := digits;
end;
function SumOfDigits(N: Integer): Integer;
var
digits: TDigitArray;
i, sum: Integer;
begin
digits := PowerOfTwo(N);
sum := 0;
for i := 0 to High(digits) do
sum := sum + digits[i];
SumOfDigits := sum;
end;
var
N: Integer;
begin
N := 15;
WriteLn('Sum of digits of 2^', N, ' is: ', SumOfDigits(N));
N := 100;
WriteLn('Sum of digits of 2^', N, ' is: ', SumOfDigits(N));
N := 1000;
WriteLn('Sum of digits of 2^', N, ' is: ', SumOfDigits(N));
end.
(*
run:
Sum of digits of 2^15 is: 26
Sum of digits of 2^100 is: 115
Sum of digits of 2^1000 is: 1366
*)