1
0
Fork 0

daily/287easy/kaprekar.{c,pas}: Use more maths for a cleaner (?) solution

This commit is contained in:
Nguyễn Gia Phong 2016-10-13 09:44:32 +07:00
parent cf7269205b
commit 8754e6d5a1
2 changed files with 12 additions and 32 deletions

View File

@ -40,19 +40,14 @@ short desc_digits(short n)
return a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
}
short asc_digits(short n)
{
sort_digits(n);
return a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0];
}
unsigned long long kaprekar(short n)
{
char i;
for (i = 0; n ^ 6174; i++)
n = desc_digits(n) - asc_digits(n);
for (i = 0; n ^ 6174; i++) {
sort_digits(n);
n = (a[0] - a[3]) * 999 + (a[1] - a[2]) * 90;
}
return i;
}

View File

@ -1,5 +1,5 @@
type
aos = array[0 .. 3] of shortint;
var
a: array[0 .. 3] of shortint;
function largest_digit(n: smallint): shortint;
var
@ -20,9 +20,8 @@ function largest_digit(n: smallint): shortint;
exit(m)
end;
function sorted_digits(n: smallint): aos;
procedure sort_digits(n: smallint);
var
a: aos;
i, j: shortint;
begin
@ -38,31 +37,16 @@ function sorted_digits(n: smallint): aos;
inc(a[i], a[j]);
a[j] := a[i] - a[j];
dec(a[i], a[j])
end;
exit(a)
end
end;
function desc_digits(n: smallint): smallint;
var
a: aos;
begin
a := sorted_digits(n);
sort_digits(n);
exit(a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3])
end;
function asc_digits(n: smallint): smallint;
var
a: aos;
begin
a := sorted_digits(n);
exit(a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0])
end;
function kaprekar(n: smallint): qword;
var
i: shortint = 0;
@ -70,8 +54,9 @@ function kaprekar(n: smallint): qword;
begin
while n <> 6174 do
begin
n := desc_digits(n) - asc_digits(n);
inc(i)
inc(i);
sort_digits(n);
n := (a[0] - a[3]) * 999 + (a[1] - a[2]) * 90
end;
exit(i)