C言語で書いてみました

過去の情報処理技術者試験の出題をもとにして、Cのソースを起こしてみました。

■ カプレカ操作1(平成18年春午後2問1設問1)

/*
 *  ソフトウェア開発 平成18年春午後2問1設問1
 *  カプレカ操作
 */

#include <stdio.h>

#define HIST_MAX    30
#define KETA_MAX    20

/* 設問1 */
int number[KETA_MAX], number2[KETA_MAX], result[KETA_MAX];

void kaprekar(int number[], int result[], int n)
{
    int i, j, k, w, borrow;

    for (i = 0; i <= n - 1; i++)    /* ループA(number2 に最小数を入れる)*/
        number2[n - 1 - i] = number[i];
    borrow = 0;
    for (i = 0; i <= n - 1; i++) {  /* ループB(n けたの引き算)*/
        result[i] = number[i] - number2[i] - borrow;
        if (result[i] >= 0) borrow = 0;
        else {
            result[i] = 10 + result[i];
            borrow = 1;
        }
    }
    for (i = 0; i <= n - 2; i++) {  /* ループC(選択法で昇順に並べ替える)*/
        k = i;
        for (j = i + 1; j <= n - 1; j++)
            if (result[k] > result[j]) k = j;
        w = result[i];
        result[i] = result[k];
        result[k] = w;
    }
}

int compare(int d1[], int d2[], int n)
{
    int i;
    for (i = 0; i <= n - 1; i++)
        if (d1[i] != d2[i]) return 0;
    return 1;
}

/* サイクルの検出(手抜き) */
int history[HIST_MAX][KETA_MAX], sp;

int check(int d[], int n)
{
    int i, j, k, flag;
    for (i = 0; i < sp; i++) {
        for (j = 0; j < n; j++) {
            flag = 0;
            if (compare(history[i], d, n) == 0) {
                flag = 1;
                break;
            }
        }
        if (flag == 0) return 1;
    }
    for (k = 0; k < n; k++)
        history[sp][k] = d[k];
    sp++;
    return 0;   
}

/* 実行例 */
int main()
{
    int i, j, k, w, keta;    
    char s[KETA_MAX + 1];

    printf("数を入力:");
    fgets(s, KETA_MAX + 1, stdin);
    i = keta = 0;
    while (s[i] != '\n' && s[i] != '\0') {
        if (s[i] >= '0' && s[i] <= '9') {
            number[keta] = s[i] - '0';
            keta++;
        }
        i++;
    }

    for (i = 0; i <= keta - 2; i++) {
        k = i;
        for (j = i + 1; j <= keta - 1; j++)
            if (number[k] > number[j]) k = j;
        w = number[i];
        number[i] = number[k];
        number[k] = w;
    }

    sp = 0;
    while (check(number, keta) == 0) {
        kaprekar(number, result, keta);
        for (i = 0; i < keta; i++)
            printf("%d", number[i] = result[i]);
        putchar('\n');
    }

    return 0;
}