我编写了一个 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.
我建议您扫描数字的数字并使用这些数字将数组中的布尔值从 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.
只需使用集合功能来保存所有数字的存在标志。纯数学解决方案:
{$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.