■ カプレカ操作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;
}