2005Cの解答
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[ACM/ICPC]]&br;
&br;
&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;
}
}
}
終了行:
[[ACM/ICPC]]&br;
&br;
&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;
}
}
}
ページ名: