6174は魔法の数!?(実践編) [C++]
過去記事[6174は魔法の数!?]で、「6174」という数は不思議な数であることを紹介しました。
C++を使って、4桁とも同じ数字でない場合は、結果がすべて「6174」になることを確認してみましたので、プログラムを紹介します。
─────
// カプレカー操作
#include <iostream>
using namespace std;
const int Kn = 4; // 桁数
const int Nm = 10000;
// 4桁の数を、4個の数字に分解する関数
void mkary(int x, int* p){
for(int j = 0; j < Kn; j++){
*p++ = x % 10;
x /= 10;
}
}
// 数字を小さい順にならべかえる関数
void sort_arry(int* p, int nm){
int i, j, tmp;
for(i = 0; i < nm - 1; i++){
for(j = i + 1; j < nm; j++){
if(p[i] > p[j]){
tmp = p[i];
p[i] = p[j];
p[j] = tmp;
}
}
}
}
int main(){
int a[Kn], b[Nm];
int i, j, x, cnt, max, min, sbn;
for(i = 0; i < Nm; i++){
cnt = 0;
x = i;
while(1){
mkary(x, a);
sort_arry(a, Kn);
max = a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0];
min = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
sbn = max - min;
printf("%d> %04d : %04d - %04d = %04d\n", ++cnt, x, max, min, sbn);
if(x == sbn) break;
x = sbn;
}
b[i] = sbn;
}
for(i = 0; i < Nm; i++){
if(b[i] != 6174) printf("%04d: %04d\n", i, b[i]);
}
}
─────
「0000」から「9999」の10000個の数のうち、結果が「6174」にならないのは、「0000」、「1111」、「2222」、「3333」、「4444」、「5555」、「6666」、「7777」、「8888」、「9999」、全部で10個しかありません。
4桁の数で、各桁の数字を組み合わせて最大の数と最小の数を作り、その差を計算する操作(カプレカー操作と呼ぶそうです^^)を繰り返すと、4桁とも同じ数字の場合以外は、すべて結果が「6174」になるということが確認できました。
どうしてこうなるのか?
これを証明した資料はあるのでしょうか。
(by 心如)
─────
【参考記事】
「カプレカー操作について」
─────
ちなみに、5桁の数字にカプレカー操作を繰り返すと、下記のとおり複数の数が循環します。
4桁の場合のように、ひとつの数の「6174」で終了というわけではないので、さほど面白いとは言えません。
コメント 0