[[ACM/ICPC]]&br; &br; &br; [[2005C:http://www.acm-japan.org/past-icpc/domestic2005/C/C_ja.html]]&br; [[2005Cの問題:http://www.acm-japan.org/past-icpc/domestic2005/C/C_ja.html]]&br; &br; &br; 回答者:[[ほへい]]&br; &br; 解法:数字文字を整数に変換して、加算処理をする。&br; 単純に4桁の整数に直せばいいものを…。面倒なことをしてます。&br; &br; 所要時間:60分&br; &br; 速度:データセット瞬殺&br; &br; 実行環境:PenM 1.6GHz 512M Win2000&br; &br; &br; #include <stdio.h> #include <string.h> FILE *fp_in, *fp_out; char *f_source = "2005C_in.txt"; char *f_answer = "2005C_out.txt"; int num_dataset; char strings[2][9]; void getAnswer(void); // 解答を求める void switchMethod(int, int, int, char*); // スイッチ文中の共通動作を抜き出した関数 void plusAns(char*,int, int); // その桁の数字を足す。再帰的に桁上がりを処理 int isNum(char); // 読み込んだ文字が数字文字かどうかの判定 void printAnswer(char*); // 解答を表示する int main(void) { int i; fp_in = fopen(f_source, "r"); fp_out = fopen(f_answer, "w"); fscanf(fp_in, "%d", &num_dataset); for(i = 0; i < num_dataset; i++) { fscanf(fp_in, "%s%s", strings[0], strings[1]); printf("%s\n%s\n", strings[0], strings[1]); getAnswer(); } fclose(fp_out); fclose(fp_in); return 0; } void getAnswer() { int i, string_index,temp; int first_len = strlen(strings[0]); int second_len = strlen(strings[1]); char answer[9] = {0, 'm', 0, 'c', 0, 'x', 0, 'i', '\0'}; for(string_index = 0; string_index < 2; string_index++) { if(string_index == 0) temp = first_len; else temp = second_len; for(i = 0; i < temp; i++) { switch (strings[string_index][i]) { case 'i' : switchMethod(i, string_index, 6, answer); break; case 'x' : switchMethod(i, string_index, 4, answer); break; case 'c' : switchMethod(i, string_index, 2, answer); break; case 'm' : switchMethod(i, string_index, 0, answer); break; } } } for(i = 0; i < 8; i += 2) { answer[i] += '0'; } printAnswer(answer); } void switchMethod(int i, int string_index, int keta, char *answer) { if(i == 0) { plusAns(answer, keta, 1); } else if(!isNum(strings[string_index][i - 1])) { plusAns(answer, keta, 1); } else { plusAns(answer, keta, strings[string_index][i - 1] - '0'); } } void printAnswer(char *answer) { int i; printf("%s\n",answer); for(i = 0; i < 9; i++) { if(answer[i] == '0') { i++; } else if(answer[i] != '1') { fprintf(fp_out, "%c", answer[i]); printf("%c", answer[i]); } } fprintf(fp_out, "\n"); printf("\n"); } int isNum(char ch) { if(ch <= '9' && ch >= '0') { return 1; } return 0; } void plusAns(char *answer, int index, int plus) { for(; index >= 0; index -= 2) { answer[index] += plus; if(answer[index] <= 9) break; else { plus = 1; answer[index] = answer[index] % 10; } } }