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