#include <stdio.h>
#include <stdbool.h>
#include <string.h>
const char* units[] = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"};
const char* tens[] = {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "C"};
const char* hundreds[] = {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "M"};
const char* symbols = "IVXLCDM";
void to_roman(int number, char *result);
bool has_one(const char *haystack, char needle);
int main(void)
{
for(int number = 1; number < 2000; number++)
{
bool ok = true;
char roman[100];
to_roman(number, roman);
for(int s = 0; symbols[s]; s++)
{
if(!has_one(roman, symbols[s]))
{
ok = false;
break;
}
}
if(ok)
printf("%d : %s\n", number
, roman
); }
return 0;
}
bool has_one(const char *haystack, char needle)
{
int count = 0;
for(int i = 0; haystack[i]; i++)
if(haystack[i] == needle && ++count == 2)
return false;
return count == 1;
}
void to_roman(int number, char *result)
{
int M = (number / 1000) % 10;
int C = (number / 100) % 10;
int X = (number / 10) % 10;
int I = (number / 1) % 10;
result[0] = '\0';
if(M != 0)
if(C != 0)
strcat(result
, hundreds
[C
- 1]); if(X != 0)
if(I != 0)
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgkjaW5jbHVkZSA8c3RkYm9vbC5oPgoJI2luY2x1ZGUgPHN0cmluZy5oPgoKCWNvbnN0IGNoYXIqIHVuaXRzW10gPSB7IkkiLCAiSUkiLCAiSUlJIiwgIklWIiwgIlYiLCAiVkkiLCAiVklJIiwgIlZJSUkiLCAiSVgiLCAiWCJ9OwoJY29uc3QgY2hhciogdGVuc1tdID0geyJYIiwgIlhYIiwgIlhYWCIsICJYTCIsICJMIiwgIkxYIiwgIkxYWCIsICJMWFhYIiwgIlhDIiwgIkMifTsKCWNvbnN0IGNoYXIqIGh1bmRyZWRzW10gPSB7IkMiLCAiQ0MiLCAiQ0NDIiwgIkNEIiwgIkQiLCAiREMiLCAiRENDIiwgIkRDQ0MiLCAiQ00iLCAiTSJ9OwoJY29uc3QgY2hhciogc3ltYm9scyA9ICJJVlhMQ0RNIjsKCgl2b2lkIHRvX3JvbWFuKGludCBudW1iZXIsIGNoYXIgKnJlc3VsdCk7Cglib29sIGhhc19vbmUoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNoYXIgbmVlZGxlKTsKCWludCBtYWluKHZvaWQpCgl7CgkJZm9yKGludCBudW1iZXIgPSAxOyBudW1iZXIgPCAyMDAwOyBudW1iZXIrKykKCQl7CgkJCWJvb2wgb2sgPSB0cnVlOwoJCQljaGFyIHJvbWFuWzEwMF07CgkJCXRvX3JvbWFuKG51bWJlciwgcm9tYW4pOwoJCQlmb3IoaW50IHMgPSAwOyBzeW1ib2xzW3NdOyBzKyspCgkJCXsKCQkJCWlmKCFoYXNfb25lKHJvbWFuLCBzeW1ib2xzW3NdKSkKCQkJCXsKCQkJCQlvayA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWlmKG9rKQoJCQkJcHJpbnRmKCIlZCA6ICVzXG4iLCBudW1iZXIsIHJvbWFuKTsKCQl9CgkJcmV0dXJuIDA7Cgl9CgoJYm9vbCBoYXNfb25lKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjaGFyIG5lZWRsZSkKCXsKCQlpbnQgY291bnQgPSAwOwoJCWZvcihpbnQgaSA9IDA7IGhheXN0YWNrW2ldOyBpKyspCgkJCWlmKGhheXN0YWNrW2ldID09IG5lZWRsZSAmJiArK2NvdW50ID09IDIpCgkJCQlyZXR1cm4gZmFsc2U7CgkJcmV0dXJuIGNvdW50ID09IDE7Cgl9CgoJdm9pZCB0b19yb21hbihpbnQgbnVtYmVyLCBjaGFyICpyZXN1bHQpCgl7CgkJaW50IE0gPSAobnVtYmVyIC8gMTAwMCkgJSAxMDsKCQlpbnQgQyA9IChudW1iZXIgLyAxMDApICUgMTA7CgkJaW50IFggPSAobnVtYmVyIC8gMTApICUgMTA7CgkJaW50IEkgPSAobnVtYmVyIC8gMSkgJSAxMDsKCQlyZXN1bHRbMF0gPSAnXDAnOwoJCWlmKE0gIT0gMCkKCQkJc3RyY2F0KHJlc3VsdCwgIk0iKTsKCQlpZihDICE9IDApCgkJCXN0cmNhdChyZXN1bHQsIGh1bmRyZWRzW0MgLSAxXSk7CgkJaWYoWCAhPSAwKQoJCQlzdHJjYXQocmVzdWx0LCB0ZW5zW1ggLSAxXSk7CgkJaWYoSSAhPSAwKQoJCQlzdHJjYXQocmVzdWx0LCB1bml0c1tJIC0gMV0pOwoJfQ==