How to count the numbers with even number of digits in an array with Pascal

1 Answer

0 votes
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

}

 



answered Sep 21 by avibootz

Related questions

...