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.