Udowodnij, że algorytm 6174(Kaprekar's constant) ma własność stopu.
Podobnie udowodnij to dla wersji tego algorytmu z trzema cyframi z liczbą 495 zamiast 6174.
podpowiedź:Sprowadź dowód do jak najmniejszej liczby przypadków, np. możesz tylko rozważać liczby o niemalejących ciagach czterech cyfr.
źródło//wazniak.mimuw.edu.pl/index.php?title=ASD_%C4%86wiczenia_1
Algorytm 6174
jest czterocyfrową liczbą naturalną niepodzielną przez 1111
// pierwszymi cyframi n mogą być zera
1 while (<>6174) do
2 := największa liczba czterocyfrowa, której cyfry są permutacją cyfr liczby ;
3 := najmniejsza liczba czterocyfrowa, której cyfry są permutacją cyfr liczby ;
4 := -
Czy rzeczywiście trzeba potraktować to "brutalnie" i sprawdzać tysiące przypadków programem czy ktoś ma jakiś lepszy pomysł?
zrobiłem taki programik który to sprawdza:
#include <stdio.h>
int main()
{
int i, n = 4, j, A[4], B[4], temp = 0, c = 0, d = 0, k, l, h, g;
A[0] = 1;
A[1] = 2;
A[2] = 3;
A[3] = 4;
c = 1234;
for (g = 1; g < 10; ++g)
for (h = 1; h < 10; ++h)
for (k = 1; k < 10; ++k)
for (l = 4; l < 10; ++l) {
A[0] = g;
A[1] = h;
A[2] = k;
A[3] = l;
c = 1000 * A[0] + 100 * A[1] + 10 * A[2] + A[3];
printf("\n %d \n ", c);
if (c % 1111 == 0 || c == 6174)
continue;
while (c != 6174) {
for (i = 0; i < n; ++i)
for (j = 1; j < n; ++j)
if (A[j - 1] < A[j]) {
temp = A[j];
A[j] = A[j - 1];
A[j - 1] = temp;
}
for (i = 0, j = 3; i < n; ++i, --j) {
B[i] = A[j];
}
printf("\n c jest rowne %d \n", c);
c = 1000 * A[0] + 100 * A[1] + 10 * A[2] + A[3];
d = 1000 * B[0] + 100 * B[1] + 10 * B[2] + B[3];
c = c - d;
printf("\n c jest rowne %d \n", c);
A[0] = c / 1000;
A[1] = c / 100 - (c / 1000) * 10;
A[2] = c / 10 - (c / 1000) * 100 - A[1] * 10;
A[3] = c - A[0] * 1000 - A[1] * 100 - A[2] * 10;
}
}
}
wersja na 495
#include <stdio.h>
int main()
{
int i, n = 3, j, A[3], B[3], temp = 0, c = 0, d = 0, k, l, h, g;
A[0] = 1;
A[1] = 2;
A[2] = 3;
c = 123;
for (g = 1; g < 10; ++g)
for (h = 1; h < 10; ++h)
for (k = 2; k < 10; ++k) {
A[0] = g;
A[1] = h;
A[2] = k;
c = 100 * A[0] + 10 * A[1] + A[2];
printf("\n %d \n ", c);
if (c % 111 == 0 || c == 495)
continue;
while (c != 495) {
for (i = 0; i < n; ++i)
for (j = 1; j < n; ++j)
if (A[j - 1] < A[j]) {
temp = A[j];
A[j] = A[j - 1];
A[j - 1] = temp;
}
for (i = 0, j = 2; i < n; ++i, --j) {
B[i] = A[j];
}
printf("\n c jest rowne %d \n", c);
c = 100 * A[0] + 10 * A[1] + A[2];
d = 100 * B[0] + 10 * B[1] + B[2];
c = c - d;
A[0] = c / 100;
A[1] = c / 10 - (c / 100) * 10;
A[2] = c - (c / 100) * 100 - A[1] * 10;
}
}
}