001 : //========================================
002 : // program.c --- ACM ICPC 2012 Domestic B
003 : // Created by M.Miyazaki [2013.01.13]
004 : //========================================
005 :
006 : #include <stdio.h>
007 : #include <stdlib.h>
008 : #include <string.h>
009 :
010 : /**
011 : * 数値リストの最大要素数
012 : */
013 : #define MAXELMS 21
014 :
015 : /**
016 : * 最大桁数
017 : */
018 : #define MAXLEN 6
019 :
020 : /*
021 : * 関数のプロトタイプ宣言
022 : */
023 : int main(int argc, char * argv[]);
024 : int input(int * f, int * s);
025 : void pfrm(int n, int d);
026 : int getMax(int n, int d);
027 : int getMin(int n, int d);
028 : void val2str(char str[], int val, int len);
029 : int getIndex(int ary[], int maxi);
030 :
031 : /**
032 : * メインプログラム.
033 : *
034 : * @param argc 引数の数
035 : * @param argv[] 引数の値
036 : * @return 終了時の値(正常終了ならEXIT_SUCCESS)
037 : */
038 : int main(int argc, char * argv[])
039 : {
040 : int n; // 入力された数値
041 : int d; // 数値および桁数
042 :
043 : while (input(&n, &d) == 1)
044 : {
045 : pfrm(n, d);
046 : }
047 :
048 : return EXIT_SUCCESS;
049 : }
050 :
051 : /**
052 : * 2数の入力を担う関数.
053 : *
054 : * @param f 1つ目の値を格納するためのポインタ
055 : * @param s 2つ目の値を格納するためのポインタ
056 : * @return 「0 0」が入力された場合は0、それ以外は1を応答する。
057 : */
058 : int input(int * f, int * s)
059 : {
060 : int r = 1;
061 :
062 : scanf("%d %d", f, s);
063 :
064 : if (*f == 0 && *s == 0)
065 : {
066 : r = 0;
067 : }
068 :
069 : return r;
070 : }
071 :
072 : /**
073 : * 数値と桁数から、問題の趣旨に沿った文字列を出力する関数.
074 : *
075 : * @param n 入力値(処理対象となる数値)
076 : * @param d 指定桁数
077 : */
078 : void pfrm(int n, int d)
079 : {
080 : int ary[MAXELMS]; // 数値リスト
081 : int c = 0; // 数値リスト用のカウンタ
082 : int max, min; // 桁の入れ替えから求まる最大値と最小値
083 : int i; // 重複要素のインデックス
084 :
085 : for (c = 0; c < MAXELMS; c++)
086 : {
087 : ary[c] = -1;
088 : }
089 : c = 0;
090 : ary[c] = n;
091 :
092 : while (1)
093 : {
094 : max = getMax(n, d);
095 : min = getMin(n, d);
096 :
097 : n = max - min;
098 : c++;
099 : ary[c] = n;
100 : i = getIndex(ary, c);
101 :
102 : if (i != -1)
103 : {
104 : printf("%d ", i);
105 : printf("%d ", ary[i]);
106 : printf("%d\n", c - i);
107 : break;
108 : }
109 : }
110 :
111 : return;
112 : }
113 :
114 : /**
115 : * 入力値の各桁を入れ替えて最大値を応答する.
116 : *
117 : * @param n 入力値(処理対象となる数値)
118 : * @param d 指定桁数
119 : * @return 最大値
120 : */
121 : int getMax(int n, int d)
122 : {
123 : int max;
124 : int i;
125 : char str[MAXLEN + 1];
126 :
127 : val2str(str, n, d);
128 :
129 : for (i = 0; i < strlen(str) - 1; i++)
130 : {
131 : if (str[i] < str[i + 1])
132 : {
133 : char tmp;
134 : tmp = str[i];
135 : str[i] = str[i + 1];
136 : str[i + 1] = tmp;
137 : i = -1;
138 : }
139 : }
140 :
141 : max = atoi(str);
142 :
143 : return max;
144 : }
145 :
146 : /**
147 : * 入力値の各桁を入れ替えて最小値を応答する.
148 : *
149 : * @param n 入力値(処理対象となる数値)
150 : * @param d 指定桁数
151 : * @return 最小値
152 : */
153 : int getMin(int n, int d)
154 : {
155 : int min;
156 : int i;
157 : char str[MAXLEN + 1];
158 :
159 : val2str(str, n, d);
160 :
161 : for (i = 0; i < strlen(str) - 1; i++)
162 : {
163 : if (str[i] > str[i + 1])
164 : {
165 : char tmp;
166 : tmp = str[i];
167 : str[i] = str[i + 1];
168 : str[i + 1] = tmp;
169 : i = -1;
170 : }
171 : }
172 :
173 : min = atoi(str);
174 :
175 : return min;
176 : }
177 :
178 : /**
179 : * 数値から文字列に変換して応答する。ただし、指定桁数に届かない分は先頭を0で埋める。
180 : *
181 : * @param str[] 変換後の文字列を格納する配列
182 : * @param val 変換元の数値
183 : * @param len 指定桁数
184 : */
185 : void val2str(char str[], int val, int len)
186 : {
187 : char fstr[10];
188 :
189 : sprintf(fstr, "%%0%dd", len);
190 : sprintf(str, fstr, val);
191 :
192 : return;
193 : }
194 :
195 : /**
196 : * 配列中に重複要素があった場合、その要素が最初に出現するインデックスを応答する.
197 : *
198 : * @param ary[] 検査対象となる数値リスト
199 : * @param maxi 数値リストに対して参照できる最大のインデックス
200 : * @return 重複要素の格納場所を指すインデックス。重複要素がなければ-1を応答する。
201 : */
202 : int getIndex(int ary[], int maxi)
203 : {
204 : int val = -1;
205 : int i1, i2; // 注目している2要素を指すインデックス
206 :
207 : for (i1 = 0; i1 < maxi; i1++)
208 : {
209 : for (i2 = i1 + 1; i2 <= maxi; i2++)
210 : {
211 : if (ary[i1] == ary[i2])
212 : {
213 : // 重複要素が見つかったため、ループから脱出する。
214 : val = i1;
215 : i1 = MAXELMS;
216 : i2 = MAXELMS;
217 : }
218 : }
219 : }
220 :
221 : return val;
222 : }
223 :
This document was generated by NanigashiBiyori on 2013/01/14 at 00:17:21.