How to resolve the algorithm Iterated digits squaring step by step in the Pascal programming language
Published on 12 May 2024 09:40 PM
How to resolve the algorithm Iterated digits squaring step by step in the Pascal programming language
Table of Contents
Problem Statement
If you add the square of the digits of a Natural number (an integer bigger than zero), you always end with either 1 or 89: An example in Python:
Or, for much less credit - (showing that your algorithm and/or language is slow): This problem derives from the Project Euler problem 92. For a quick algorithm for this task see the talk page
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Iterated digits squaring step by step in the Pascal programming language
Source code in the pascal programming language
program Euler92;
const
maxdigCnt = 14;
//2* to use the sum of two square-sums without access violation
maxPoss = 2* 9*9*maxdigCnt;// every digit is 9
cM = 10*1000*1000;// 10^(maxdigCnt div 2)
IdxSqrSum = cM;//MaxPoss;//max(cM,MaxPoss);
type
tSqrSum = array[0..IdxSqrSum] of Word;
tEndsIn = array[0..maxPoss]of Byte;
tresCache = array[0..maxPoss]of Uint64;
var
aSqrDigSum : tSqrSum;
aEndsIn: tEndsIn;
aresCache : tresCache;
procedure CreateSpuareDigitSum;
var
i,j,k,l : integer;
begin
For i := 0 to 9 do
aSqrDigSum[i] := sqr(i);
k := 10;
l := k;
while k < cM do
begin
For i := 1 to 9 do
For j := 0 to k-1 do
begin
aSqrDigSum[l]:=aSqrDigSum[i]+aSqrDigSum[j];
inc(l);
end;
k := l;
end;
aSqrDigSum[l] := 1;
end;
function InitEndsIn(n:LongWord):longWord;
{fill aEndsIN recursive}
var
d,s:LongWord;
begin
IF n in [0..1] then
begin
InitEndsIn := n;
EXIT;
end;
s := aSqrDigSum[n];
{if unknown}
IF aEndsIN[s] = byte(-1) then
begin
d := InitEndsIn(s);
aEndsIN[s]:= d;
InitEndsIn := d;
end
else
InitEndsIn := aEndsIN[s];
end;
function CntSmallOnes(s:longWord;
n:longWord=cM-1):NativeUint;
var
i: longword;
begin
result := 0;
For i := cM-1 downto 0 do
result := result+aEndsIN[aSqrDigSum[i]+s];
end;
procedure Init;
var
i,j,cnt : integer;
begin
CreateSpuareDigitSum;
fillchar(aEndsIN,Sizeof(aEndsIN) ,#255);
aEndsIN[0] := 0;
aEndsIN[1]:= 1;
aEndsIN[89]:= 0;// no need to use 89
For i := 1 to maxPoss do
aEndsIN[i]:= InitEndsIN(i);
cnt := 0;
fillchar(aresCache,SizeOf(aresCache),#0);
For i := Low(tSqrSum) to high(tSqrSum) do
begin
j := aSqrDigSum[i];
If aresCache[j] = 0 then
begin
// write(i,',');
aresCache[j] := CntSmallOnes(j);
inc(cnt);
end;
end;
// writeln; writeln(cnt,' small counts out of ',cM);
end;
{
function EndsIn(n:LongWord):Word;
var
d,s:LongWord;
begin
d := n;
s := 0;
while d > High(tSqrSum) do
begin
s := s+aSqrDigSum[d Mod cM];
d := d Div cM
end;
s :=s+aSqrDigSum[d];
EndsIn := aEndsIN[s];
end;
}
function CntOnes(s: longWord;n:Int64):Int64;
var
i : Int64;
begin
writeln;
result := 0;
i := n div cM;
repeat
result := result+aresCache[s+aSqrDigSum[i]];
dec(i)
until i < 0
end;
const
upperlimit = cM*cM ;
var
Res : Int64;
begin
Init;
Res := CntOnes(0,upperlimit-1)+1;
writeln('there are ',res,' 1s ');
writeln('there are ',upperlimit-res,' 89s ');
end.
You may also check:How to resolve the algorithm Four bit adder step by step in the Rust programming language
You may also check:How to resolve the algorithm Greatest common divisor step by step in the Klong programming language
You may also check:How to resolve the algorithm Multiplication tables step by step in the TypeScript programming language
You may also check:How to resolve the algorithm Levenshtein distance step by step in the Zig programming language
You may also check:How to resolve the algorithm Bitmap step by step in the C programming language