TYVJ 1070 罗马数字 解题报告

  这题一开始确实会感觉很难,但是罗马数字的个位只有可能是{"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},同理,十位上的数字也永远都是固定的,所以还是简单吧,实现代码如下:

#include <stdio.h>
#include <stdlib.h>
char num[4][10][5] = {
	{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
	{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
	{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
	{"", "M", "MM", "MMM"}};
int have[7];
int name[7] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};

int order(char c)
{
	switch(c){
	case 'I':
		return 0;
	case 'V':
		return 1;
	case 'X':
		return 2;
	case 'L':
		return 3;
	case 'C':
		return 4;
	case 'D':
		return 5;
	case 'M':
		return 6;
	}
}

void add(int a, int b)
{
	int i;
	for(i = 0; num[a][b][i] != '\0'; i++){
		have[order(num[a][b][i])]++;
	}
}

void count(int k)
{
	int i = 0;
	while(k != 0){
		add(i, k % 10);
		k /= 10, i++;
	}
}

int main(int argc, char **argv)
{
	int i;
	int n;
	scanf("%d", &n);
	for(i = 1; i <= n; i++){
		count(i);
	}
	for(i = 0; i < 7; i++){
		if(have[i]){
			printf("%c %d\n", name[i], have[i]);
		}
	}
	return 0;
}

posted @ 2011-07-02 12:07  zqynux  阅读(332)  评论(0编辑  收藏  举报