用于验证数字是否包含从 1 到 9 的所有数字的 FreePascal 代码不起作用

问题描述 投票:0回答:2

我编写了一个 FreePascal 程序,该程序应该验证一个数字是否由 1 到 9 的所有数字组成(例如 123456789 或 987564123),但它仅适用于 987654321 作为输入(即它显示

yes
) .

program verify1 ;
Uses Wincrt ;
Var
  n,i,r,e : Longint;
Begin
  Readln(n);
  e := 0;
  For i:=1 To 9 Do
    Begin
      Repeat
        r := n Mod 10 ;
        n := n Div 10 ;
      Until (r=i) Or (n=0);
      If (r=i) Then e := e+1 ;
    End;
  If e=9 Then Writeln ('yes')
  Else Writeln ('no');
End.

我尝试过使用另一种算法,但没有任何改变。

Program verify2 ;
Uses Wincrt ;
Var
  n,i,r : Longint;
  condition: Boolean;
Begin
  Readln(n);
  i := 1;
  Repeat
    Repeat
      r := n Mod 10 ;
      n := n Div 10 ;
    Until (r=i) Or (n=0);
    If (r=i) Then
      Begin
        condition := True ;
        i := i+1 ;
      End
            else condition := false ; 
  Until (i=10) or ( condition = false );
  If condition=True Then Writeln ('yes');
  If condition = False Then Writeln ('no');
End.
numbers freepascal digits
2个回答
0
投票

我建议您扫描数字的数字并使用这些数字将数组中的布尔值从 false 翻转为 true 以指示它们是否存在。如果完成后索引 1 到 9 中的所有值都为 true,则所有数字都在数字中。

program check_digits;
var
  test : array [0..9] of boolean = (
    false, false, false, false,
    false, false, false, false,
    false, false
  );
  n : longint;
  i : integer;
  found_all : boolean;

begin
  readln(n);

  while n > 0 do
  begin
    test[n mod 10] := true;
    n := n div 10;
  end;

  found_all := true;
  for i := 1 to 9 do
    if not test[i] then found_all := false;

  if found_all then
    writeln('All digits present.')
  else
    writeln('Some digits missing.');

end.

0
投票

只需使用集合功能来保存所有数字的存在标志。纯数学解决方案:

{$MODE OBJFPC}{$H+}

  function HasAllDigits(ANumber: Integer): Boolean;
  var
    Digits: set of 0 .. 9 = [];
  begin
    ANumber := Abs(ANumber);

    while ANumber > 9 do
    begin
      Digits  += [ANumber mod 10];
      ANumber := ANumber div 10;
    end;

    Digits += [ANumber];
    Result := Digits = [1 .. 9];
  end;

begin
  WriteLn(HasAllDigits(2137));       // False
  WriteLn(HasAllDigits(1234567890)); // True
end.

第二种方案,基于字符串:

{$MODE OBJFPC}{$H+}

uses
  SysUtils;

  function HasAllDigits(ANumber: Integer): Boolean;
  var
    Digit:  Char;
    Digits: set of '0' .. '9' = [];
  begin
    for Digit in IntToStr(Abs(ANumber)) do
      Digits += [Digit];

    Result := Digits = ['1' .. '9'];
  end;

begin
  WriteLn(HasAllDigits(2137));       // False
  WriteLn(HasAllDigits(1234567890)); // True
end.
© www.soinside.com 2019 - 2024. All rights reserved.