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 MAX_ELEMENTS 21
014 : 
015 : /**
016 :  * 最大桁数
017 :  */
018 : #define MAX_LENGTH 6
019 : 
020 : /*
021 :  * 関数のプロトタイプ宣言
022 :  */
023 : int main(int argumentCount, char * argumentValues[]);
024 : int input(int * firstPointer, int * secondPointer);
025 : void perform(int aValue, int numberOfDigit);
026 : int getMaxNumber(int aValue, int numberOfDigit);
027 : int getMinNumber(int aValue, int numberOfDigit);
028 : void stringFromValueWithLength(char valueString[], int aValue, int length);
029 : int getIndexOfDuplication(int valueArray[], int maxIndex);
030 : 
031 : /**
032 :  * メインプログラム.
033 :  *
034 :  * @param argumentCount 引数の数
035 :  * @param argumentValues[] 引数の値
036 :  * @return 終了時の値(正常終了ならEXIT_SUCCESS)
037 :  */
038 : int main(int argumentCount, char * argumentValues[])
039 : {
040 :     int aValue;          // 入力された数値
041 :     int numberOfDigit;   // 数値および桁数
042 :     
043 :     while (input(&aValue, &numberOfDigit) == 1)
044 :     {
045 :     perform(aValue, numberOfDigit);
046 :     }
047 :     
048 :     return EXIT_SUCCESS;
049 : }
050 : 
051 : /**
052 :  * 2数の入力を担う関数.
053 :  *
054 :  * @param firstPointer 1つ目の値を格納するためのポインタ
055 :  * @param secondPointer 2つ目の値を格納するためのポインタ
056 :  * @return 「0 0」が入力された場合は0、それ以外は1を応答する。
057 :  */
058 : int input(int * firstPointer, int * secondPointer)
059 : {
060 :     int returnValue = 1;
061 :     
062 :     scanf("%d %d", firstPointer, secondPointer);
063 :     
064 :     if (*firstPointer == 0  &&  *secondPointer == 0){
065 :     returnValue = 0;}
066 : 
067 :     return returnValue;
068 : }
069 : 
070 : /**
071 :  * 数値と桁数から、問題の趣旨に沿った文字列を出力する関数.
072 :  *
073 :  * @param aValue 入力値(処理対象となる数値)
074 :  * @param numberOfDigit 指定桁数
075 :  */
076 : void perform(int aValue, int numberOfDigit)
077 : {
078 :     int valueArray[MAX_ELEMENTS];   // 数値リスト
079 :     int count = 0;                  // 数値リスト用のカウンタ
080 :     int maxNumber, minNumber;       // 桁の入れ替えから求まる最大値と最小値
081 :     int indexOfDuplication;         // 重複要素のインデックス
082 :     
083 :     for (count = 0; count < MAX_ELEMENTS; count++)
084 :     {
085 :     valueArray[count] = -1;
086 :     }
087 :     count = 0;
088 :     valueArray[count] = aValue;
089 :     
090 :     while (1)
091 :     {
092 :       maxNumber = getMaxNumber(aValue, numberOfDigit);
093 :       minNumber = getMinNumber(aValue, numberOfDigit);
094 :         
095 :         aValue = maxNumber - minNumber;
096 :         count++;
097 :         valueArray[count] = aValue;
098 :         indexOfDuplication = getIndexOfDuplication(valueArray, count);
099 :         
100 :         if (indexOfDuplication != -1)
101 :         {
102 :           printf("%d ", indexOfDuplication);
103 :           printf("%d ", valueArray[indexOfDuplication]);
104 :           printf("%d\n", count - indexOfDuplication);
105 :           break;}
106 : }
107 : 
108 : return;
109 : }
110 : 
111 : /**
112 :  * 入力値の各桁を入れ替えて最大値を応答する.
113 :  *
114 :  * @param aValue 入力値(処理対象となる数値)
115 :  * @param numberOfDigit 指定桁数
116 :  * @return 最大値
117 :  */
118 : int getMaxNumber(int aValue, int numberOfDigit)
119 : {
120 :     int maxNumber;
121 :     int index;
122 :     char valueString[MAX_LENGTH + 1];
123 :     
124 :     stringFromValueWithLength(valueString, aValue, numberOfDigit);
125 :     
126 :     for (index = 0; index < strlen(valueString) - 1; index++)
127 :     {
128 :         if (valueString[index] < valueString[index + 1])
129 :         {
130 :           char temporaryCharacter;
131 :           temporaryCharacter     = valueString[index];
132 :           valueString[index]     = valueString[index + 1];
133 :           valueString[index + 1] = temporaryCharacter;
134 :           index = -1;
135 :           }
136 :        }
137 :     
138 :       maxNumber = atoi(valueString);
139 :         
140 :       return maxNumber;
141 : }
142 : 
143 : /**
144 :  * 入力値の各桁を入れ替えて最小値を応答する.
145 :  *
146 :  * @param aValue 入力値(処理対象となる数値)
147 :  * @param numberOfDigit 指定桁数
148 :  * @return 最小値
149 :  */
150 : int getMinNumber(int aValue, int numberOfDigit)
151 : {
152 :     int minNumber;
153 :     int index;
154 :     char valueString[MAX_LENGTH + 1];
155 :     
156 :     stringFromValueWithLength(valueString, aValue, numberOfDigit);
157 :     
158 :     for (index = 0; index < strlen(valueString) - 1; index++)
159 :     {
160 :         if (valueString[index] > valueString[index + 1])
161 :         {
162 :         char temporaryCharacter;
163 :         temporaryCharacter     = valueString[index];
164 :         valueString[index]     = valueString[index + 1];
165 :         valueString[index + 1] = temporaryCharacter;
166 :         index = -1;
167 :       }
168 :     }
169 :     
170 :     minNumber = atoi(valueString);
171 :     
172 :     return minNumber;
173 : }
174 : 
175 : /**
176 :  * 数値から文字列に変換して応答する。ただし、指定桁数に届かない分は先頭を0で埋める。
177 :  *
178 :  * @param valueString[] 変換後の文字列を格納する配列
179 :  * @param aValue 変換元の数値
180 :  * @param length 指定桁数
181 :  */
182 : void stringFromValueWithLength(char valueString[], int aValue, int length)
183 : {
184 :     char formatString[10];
185 :     
186 :     sprintf(formatString, "%%0%dd", length);
187 :     sprintf(valueString, formatString, aValue);
188 :     
189 :     return;
190 : }
191 : 
192 : /**
193 :  * 配列中に重複要素があった場合、その要素が最初に出現するインデックスを応答する.
194 :  *
195 :  * @param valueArray[] 検査対象となる数値リスト
196 :  * @param maxIndex 数値リストに対して参照できる最大のインデックス
197 :  * @return 重複要素の格納場所を指すインデックス。重複要素がなければ-1を応答する。
198 :  */
199 : int getIndexOfDuplication(int valueArray[], int maxIndex)
200 : {
201 :     int indexOfDuplication = -1;
202 :     int index1, index2;   // 注目している2要素を指すインデックス
203 :     
204 :     for (index1 = 0; index1 < maxIndex; index1++)
205 :     {
206 :         for (index2 = index1 + 1; index2 <= maxIndex; index2++)
207 :         {
208 :             if (valueArray[index1] == valueArray[index2])
209 :             {
210 :                 // 重複要素が見つかったため、ループから脱出する。
211 :                 indexOfDuplication = index1;
212 :                 index1 = MAX_ELEMENTS;
213 :                 index2 = MAX_ELEMENTS;}}}
214 :     
215 :     return indexOfDuplication;
216 : }
217 : 

This document was generated by NanigashiBiyori on 2013/01/14 at 00:08:11.