PAT-B 1019デジタルブラックホール(C言語)

1791 ワード

タイトル
リンク:PAT(Basic Level)Practice 1019デジタルブラックホール
各桁の数字が全く同じではない4桁の正の整数を指定します.まず、4つの数字を非増分順に並べてから、非増分順に並べて、1番目の数字で2番目の数字を減らすと、新しい数字が得られます.このように繰り返して、私たちはすぐに「デジタルブラックホール」と呼ばれる6174に止まります.この不思議な数字もKaprekar定数と呼ばれています.
例えば6767から
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...

任意の4ビットの正の整数を指定し、ブラックホールに到達するプロセスを示すプログラムを作成します.
入力形式:
入力は、区間内の正の整数Nを与える.
出力フォーマット:
Nの4桁の数字がすべて等しい場合、1行にN-N=0000を出力する.そうでなければ、計算された各ステップは、6174が差として現れるまで1行に出力され、出力フォーマットは例を参照する.注意各数字は4桁で出力されます.
サンプル1を入力:
6767
出力サンプル1:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174
入力サンプル2:
2222
出力サンプル2:
2222 - 2222 = 0000
構想
  • 数字の各位数を並べ替えて最大数を求めます;
  • 並べ替えた数字を反転して最小数を得る.
  • は、2つの差が6174または0の場合に終了するまで循環する.

  • コード#コード#
    #include
    #include
    
    int Max(int r);     //          
    int Flip(int max);  //  
    
    int main() {
        
      int r, max, min;
      scanf("%d", &r);
    
        do{
          max = Max(r);
          min = Flip(max);
          r = max - min;
          printf("%04d - %04d = %04d
    ", max, min, r); }while(r != 0 && r != 6174); return 0; } int Max(int r) { int m[4] = {r / 1000, r % 1000 / 100, r % 100 / 10, r % 10}; char n; int i, j; for(i = 0; i < 3; i++) { for(j = i + 1; j < 4; j++) { if(m[i] < m[j]) { n = m[i]; m[i] = m[j]; m[j] = n; } } } return m[0] * 1000 + m[1] * 100 + m[2] * 10 + m[3]; } int Flip(int max){ return max / 1000 + max % 1000 / 100 * 10 + max % 100 / 10 * 100 + max % 10 * 1000; }

    ---END---