[[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;
        }
    }
 }

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS