SSブログ

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]);
    }
}
─────
CPP cd005.jpg


 「0000」から「9999」の10000個の数のうち、結果が「6174」にならないのは、「0000」、「1111」、「2222」、「3333」、「4444」、「5555」、「6666」、「7777」、「8888」、「9999」、全部で10個しかありません。
 4桁の数で、各桁の数字を組み合わせて最大の数と最小の数を作り、その差を計算する操作(カプレカー操作と呼ぶそうです^^)を繰り返すと、4桁とも同じ数字の場合以外は、すべて結果が「6174」になるということが確認できました。

 どうしてこうなるのか?

 これを証明した資料はあるのでしょうか。

(by 心如)
─────

【参考記事】
カプレカー操作について

─────

 ちなみに、5桁の数字にカプレカー操作を繰り返すと、下記のとおり複数の数が循環します。
CPP cd006.jpg

 6桁の数も、下記のとおり複数の数で循環します。
CPP cd007.jpg

 4桁の場合のように、ひとつの数の「6174」で終了というわけではないので、さほど面白いとは言えません。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。