program CountEvenDigitNumbers;
{
Architecture notes:
-------------------
This program demonstrates a small, modular design:
- A function to count digits safely.
- A function to check if a number has an even digit count.
- A function to count how many numbers in an array satisfy the condition.
- Multiple test cases in main.
Performance notes:
------------------
- All operations are O(n) for n array elements.
- Digit counting uses integer division, avoiding string conversions.
- No dynamic memory allocation; arrays are static for predictability.
Security notes:
---------------
- No unsafe pointer operations.
- Input values are validated where needed.
- No external dependencies.
}
{$mode objfpc}{$H+}
{------------------------------------------------------------
CountDigits: returns the number of digits in an integer.
Complexity: O(log n) due to repeated division by 10.
Pitfall: negative numbers must be handled correctly.
------------------------------------------------------------}
function CountDigits(Value: Integer): Integer;
var
n: Integer;
begin
if Value = 0 then
Exit(1); { Zero has one digit }
n := Abs(Value); { Ensure negative numbers are handled }
Result := 0;
while n > 0 do
begin
n := n div 10;
Inc(Result);
end;
end;
{------------------------------------------------------------
HasEvenDigits: returns True if the number has an even
number of digits.
------------------------------------------------------------}
function HasEvenDigits(Value: Integer): Boolean;
begin
Result := (CountDigits(Value) mod 2 = 0);
end;
{------------------------------------------------------------
CountEvenDigitNumbers: counts how many numbers in an array
have an even number of digits.
Complexity: O(n)
------------------------------------------------------------}
function CountEvenDigitNumbers(const Arr: array of Integer): Integer;
var
i: Integer;
begin
Result := 0;
for i := Low(Arr) to High(Arr) do
begin
if HasEvenDigits(Arr[i]) then
Inc(Result);
end;
end;
{------------------------------------------------------------
Utility: PrintArray
------------------------------------------------------------}
procedure PrintArray(const Arr: array of Integer);
var
i: Integer;
begin
Write('[ ');
for i := Low(Arr) to High(Arr) do
Write(Arr[i], ' ');
Write(']');
end;
{------------------------------------------------------------
Main: multiple test cases, including edge cases.
------------------------------------------------------------}
var
A1: array[0..4] of Integer = (12, 345, 2, 6, 7896);
A2: array[0..3] of Integer = (0, -22, 1000, -7);
A3: array[0..2] of Integer = (1, 3, 5); { No even-digit numbers }
A4: array[0..2] of Integer = (10, 99, 1001); { All even-digit numbers }
begin
WriteLn('=== Count Numbers with Even Number of Digits (Free Pascal) ===');
WriteLn;
{ Test case 1 }
Write('Test 1: ');
PrintArray(A1);
WriteLn(' -> Count = ', CountEvenDigitNumbers(A1));
{ Test case 2: includes negative numbers and zero }
Write('Test 2: ');
PrintArray(A2);
WriteLn(' -> Count = ', CountEvenDigitNumbers(A2));
{ Test case 3: no even-digit numbers }
Write('Test 3: ');
PrintArray(A3);
WriteLn(' -> Count = ', CountEvenDigitNumbers(A3));
{ Test case 4: all even-digit numbers }
Write('Test 4: ');
PrintArray(A4);
WriteLn(' -> Count = ', CountEvenDigitNumbers(A4));
end.
{
run:
=== Count Numbers with Even Number of Digits (Free Pascal) ===
Test 1: [ 12 345 2 6 7896 ] -> Count = 2
Test 2: [ 0 -22 1000 -7 ] -> Count = 2
Test 3: [ 1 3 5 ] -> Count = 0
Test 4: [ 10 99 1001 ] -> Count = 3
}