用 Pascal 编写一个程序来计算 Happy Numbers。陷入无限循环

Writing a program to calculate Happy Numbers in Pascal. Stuck with an infinite loop

我正在编写一个程序来进行计算。该程序要求用户输入 1 到 9999 之间的任意数字,然后计算该数字是否是快乐数字。

program EindEvaluatieProceduresFuncties2;

   uses wincrt, math;

   var lucky: boolean;
    num: longint;
    i, j: integer;
    arr: array [1..4] of integer;
    sum: integer;


   procedure HappyNumber;

   begin
   repeat
   begin
        repeat
        begin
            i:=i+1;
            //writeln('i = ',i);
            arr[i]:=num mod 10;
            //writeln( 'a[i] = ', arr[i] );
            num:=num div 10;
            //writeln ( 'n = ', num );
       end;
       until num=0;
       //writeln('Digits are : ');
       //for j:=i downto 1 do
       //writeln('a[j] = ', arr[j],'   ', j);
       //writeln('Calculating Happy Number');
       for j := i downto 1 do
       sum := sum + (Sqr(arr[j]));
       for j := i downto 1 do
       writeln('sum = ',sum);
       num := sum;

   end;
   until sum < 10 ;
   end;

   begin
     lucky := false;
     writeln('Please give a positive number below 10000.');
     readln(num);
     while ( num < 1 ) or ( num > 9999 ) do
     begin
       writeln('Number must be positive and less than 10000. Try again.');
       readln(num);
     end;
     HappyNumber;
     if (lucky = True) then
     begin
       writeln(num, ' is a happy number.');
     end
     else
     begin
       writeln(num, ' is not a happy number.');
     end;
     writeln('');
     writeln('Press < ENTER > to end the program.');
     readln;
   end.     

在程序中我有命令 i := 0;如下所示:

procedure HappyNumber;

       begin
       repeat
       begin
            repeat
            begin
                i:=0;
                i:=i+1;

这就是问题所在。如果我这样做,它会变成一个无限循环,但是如果我将命令放在重复循环之外,那么我不会在循环的每次迭代开始时重置为 0,这是我需要的。

我应该指出,目前有很多代码只是为了让我看看发生了什么,不会成为最终代码的一部分。无论我在何处插入“//”,都是那些行。

我知道我可能有更好的方法来完成整个程序。如果有人对我如何简化它有任何建议,我也将非常感激。

谢谢。

从没听说过快乐/不快乐的数字,发现解决这个任务很有趣:-)

还有很多地方需要优化,但我想你可以用它来学习。

program EindEvaluatieProceduresFuncties2;

uses SysUtils, crt ;

var input: string;
    number: integer;
    code: integer;

function HapyNumber(num: integer):boolean;
var
  erg: integer;
  digit: integer;
begin
  Result := true;
  erg := 0;
  if num = 4 then Result := false;
  if num = 4 then exit;
  if num = 1 then exit;
  if num = 0 then exit;

  // serialize the number into digits and calculate the next number
  while num > 0 do begin
    digit := num mod 10;
    num   := num div 10;
    erg := erg + digit * digit;
    write(IntToStr(digit) + ' ');
  end;

  write(IntToStr(num) + ' ');
  writeln('=' + IntToStr(erg));
  Result := HapyNumber(erg);
end;

begin

  repeat
    writeln('Please give a positive number below 10000.' + sLineBreak + 'Number must be positive and less than 10000.' + sLineBreak + 'Type x for exit!');
    readln(input);
    if lowerCase(input) = 'x' then exit;
    val(input, number, code);
    if code <> 0 then begin
      ClrScr;
      writeln('Invalid number "' + input + '" !');
    end
      else if (number > 0) and (number <= 9999) then begin
        ClrScr;
        writeln('Cheking ' + IntToStr(number) + '..');
        if HapyNumber(number) then writeln(number, ' is a happy number.')
          else writeln(number, ' is not a happy number.');
        writeln('Press enter to continue');
        readln;
        ClrScr;
      end;

  until lowerCase(input) = 'x';
end.

重要的代码部分是

  while num > 0 do begin
    digit := num mod 10;
    num   := num div 10;
    erg := erg + digit * digit;
    write(IntToStr(digit) + ' '); // just output the tmp result
  end;

它将数字序列化为数字(1973 将是 3 7 9 1)

我使用递归只是为了好玩,并不是真的有必要:-)