Numeral System

mike090527

Numeral System

こんな泥臭いソースでも,ちゃんとした答えが出ればよいのです.

#include <stdio.h>

int main(void)
{
	puts("MCXI");

	//	ファイル出力準備
	FILE	*pfI;	//	入力ファイルポインタ
	FILE	*pfO;	//	出力ファイルポインタ
	pfI = fopen("c.in", "r");
	if(pfI == NULL)
	{
		printf("ERR: input file open\n");
		return -1;
	}
	pfO = fopen("c.out","w");
	if(pfO == NULL)
	{
		printf("ERR: output file open\n");
		fclose(pfI);
		return -2;
	}

	//
	//	入力
	//
	int n;	//	計算指示の数
	char s1[9], s2[9];
	fscanf(pfI, "%d", &n);

	for(int i = 0; i < n; i++)
	{
		fscanf(pfI, "%s%s", s1, s2);
		printf("%d: %s %s\n", i, s1, s2);
		
		//
		//	処理
		//
		int *m1, *m2;	//	式 mcxi
		int *m;
		m1 = new int [4];
		m2 = new int [4];
		m = new int [4];
		for(int j = 0; j < 4; j++)
		{
			m[j] = m1[j] = m2[j] = 0;
		}

		//	値の代入
		//	s1
		for(int j = 0; s1[j] != 0;)
		{
			//	数字がある
			if('2' <= s1[j] && s1[j] <= '9')
			{
				switch(s1[j+1])
				{
				case 'm':
					m1[0] =+ s1[j] - '0';
					break;
				case 'c':
					m1[1] =+ s1[j] - '0';
					break;
				case 'x':
					m1[2] =+ s1[j] - '0';
					break;
				case 'i':
					m1[3] =+ s1[j] - '0';
					break;
				}
				j += 2;
			}
			else	//	文字だけ
			{
				switch(s1[j])
				{
				case 'm':
					m1[0] =+ 1;
					break;
				case 'c':
					m1[1] =+ 1;
					break;
				case 'x':
					m1[2] =+ 1;
					break;
				case 'i':
					m1[3] =+ 1;
					break;
				}
				j += 1;
			}	
		}
		printf("%d %d %d %d\n", m1[0], m1[1], m1[2], m1[3]);

		//	s2
		for(int j = 0; s2[j] != 0;)
		{
			//	数字がある
			if('2' <= s2[j] && s2[j] <= '9')
			{
				switch(s2[j+1])
				{
				case 'm':
					m2[0] =+ s2[j] - '0';
					break;
				case 'c':
					m2[1] =+ s2[j] - '0';
					break;
				case 'x':
					m2[2] =+ s2[j] - '0';
					break;
				case 'i':
					m2[3] =+ s2[j] - '0';
					break;
				}
				j += 2;
			}
			else	//	文字だけ
			{
				switch(s2[j])
				{
				case 'm':
					m2[0] =+ 1;
					break;
				case 'c':
					m2[1] =+ 1;
					break;
				case 'x':
					m2[2] =+ 1;
					break;
				case 'i':
					m2[3] =+ 1;
					break;
				}
				j += 1;
			}	
		}
		printf("%d %d %d %d\n", m2[0], m2[1], m2[2], m2[3]);

		//	足し算
		//	繰上げをあとにやる
		for(int j = 0; j < 4; j++)
		{
			m[j] = m1[j] + m2[j];
		}
		for(int j = 3; j >= 0; j--)
		{
			if(m[j] >= 10)
			{
				m[j-1] += 1;
				m[j] -= 10;
			}
		}
		printf("%d %d %d %d\n", m[0], m[1], m[2], m[3]);

		//
		//	出力
		//
		if(m[0] != 0)
		{
			if(m[0] > 1)
				fprintf(pfO, "%dm", m[0]);
			else
				fprintf(pfO, "m");
		}
		if(m[1] != 0)
		{
			if(m[1] > 1)
				fprintf(pfO, "%dc", m[1]);
			else
				fprintf(pfO, "c");
		}
		if(m[2] != 0)
		{
			if(m[2] > 1)
				fprintf(pfO, "%dx", m[2]);
			else
				fprintf(pfO, "x");
		}
		if(m[3] != 0)
		{
			if(m[3] > 1)
				fprintf(pfO, "%di", m[3]);
			else
				fprintf(pfO, "i");
		}
		fprintf(pfO, "\n");

		delete [] m;
		delete [] m1;
		delete [] m2;
	}

	//	ファイル出力
	//fprintf(pfO, "Hello World!! - out\n");

	//ファイルポインタを閉じる
	fclose(pfI);
	fclose(pfO);

	return 0;
}