Largest number divisible by its digits: Difference between revisions

Added Delphi example
(Changed algorithm for base 10 and added base 16.)
(Added Delphi example)
Line 615:
{{out}}
<pre>9867312</pre>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{Trans|Go}}
===base 10===
<lang Delphi>
program Largest_number_divisible_by_its_digits;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils;
 
type
TSetAnsiChar = set of AnsiChar;
 
function DivByAll(num: Integer; digits: TSetAnsiChar): Boolean;
var
offset: byte;
begin
offset := ord('0');
for var d in digits do
begin
if (num mod (ord(d) - offset)) <> 0 then
exit(false);
end;
Result := true;
end;
 
begin
var magic: Cardinal := 9 * 8 * 7;
var h: Cardinal := 9876432 div magic * magic;
for var i := h downto magic do
begin
if i mod 10 = 0 then
Continue;
 
var s := i.tostring;
if (s.indexOf('0') > -1) or (s.indexOf('5') > -1) then
Continue;
var digits: TSetAnsiChar := [];
var isUnic := true;
for var b in ansistring(s) do
if not (b in digits) then
Include(digits, b)
else
begin
isUnic := false;
break;
end;
 
if not isUnic then
Continue;
 
if DivByAll(i, digits) then
begin
writeln('Largest decimal number is ', i);
Break;
end;
end;
readln;
end.</lang>
 
===base 16===
<lang Delphi>
program Largest_number_divisible_by_its_digits;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils;
 
type
TSetAnsiChar = set of AnsiChar;
 
function DivByAll(num: Uint64; digits: TSetAnsiChar): Boolean;
var
offset_dec, offset_hex: byte;
begin
offset_dec := ord('0');
offset_hex := ord('W');
 
for var digit in digits do
begin
var d: byte := 0;
if digit <= '9' then
d := ord(digit) - offset_dec
else
d := ord(digit) - offset_hex;
if (num mod d) <> 0 then
exit(false);
end;
Result := true;
end;
 
begin
var magic: Uint64 := 15 * 14 * 13 * 12 * 11;
var h: Uint64 := $fedcba987654321 div magic * magic;
writeln('Wait while search for');
for var i := h downto magic do
begin
if (i mod 16) = 0 then
Continue;
 
var s := i.ToHexString(0).ToLower;
if (s.indexOf('0') > -1) then
Continue;
 
var digits: TSetAnsiChar := [];
var isUnic := true;
for var b in ansistring(s) do
if not (b in digits) then
Include(digits, b)
else
begin
isUnic := false;
break;
end;
 
if not isUnic then
Continue;
 
if DivByAll(i, digits) then
begin
writeln('Largest hex number is ', i.ToHexString);
Break;
end;
end;
readln;
end.</lang>
=={{header|Factor}}==
===Base 10===
Line 644 ⟶ 772:
Running time: 0.07224931499999999 seconds
</pre>
 
 
=={{header|Go}}==
478

edits