代码很简单,采用查表法做。所以直接贴出来吧。
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
char lut_1[10][8] = {"I","II","III","IV","V","VI","VII","VIII","IX"};
char lut_10[10][8] = {"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
char lut_100[10][8] = {"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
char lut_1000[10][8] = {"M","MM","MMM"};
/* * *
func_def: to separate int numbers into bits , store them to a int buffer
return length
example : when num_int is 1234 , num_bit_buf[0] = 1 , num_bit_buf[1] = 2 ,
num_bit_buf[2] = 3 , num_bit_buf[3] = 4 , return 4
* * */
int separate(int num_int , int * num_bit_buf)
{
int i = 0,j = 0;
if(num_int > 999)
{
num_bit_buf[i] = num_int / 1000; //thousand
num_bit_buf[i+1] = (num_int % 1000 ) /100; //hundrand
num_bit_buf[i+2] = (num_int % 100 ) / 10;
num_bit_buf[i+3] = (num_int % 10) ;
return 4;
}
else if(num_int > 99)
{
num_bit_buf[i] = num_int / 100;
num_bit_buf[i+1] = (num_int % 100) / 10;
num_bit_buf[i+2] = (num_int % 10);
return 3;
}
else if(num_int > 9)
{
num_bit_buf[i] = num_int / 10 ;
num_bit_buf[i+1] = num_int % 10;
return 2;
}
else
{
num_bit_buf[i] = num_int;
return 1;
}
}
int int_2_roma(int num_int , char * roma_buf)
{
int num_bit_buf[4] , len = 0 , i=0;
len = separate(num_int,num_bit_buf);
//printf("lens is %d\n", len);
if(len<1)
{
printf("error when separate!\n");
return -1;
}
#if 0 //set to 0 when we stop debug
for(i=0;i<len;i++)
{
printf("num_bit_buf[%d] is %d\n", i, num_bit_buf[i]);
}
#endif
switch(len)
{
case 4:
{
strcpy(roma_buf,lut_1000[num_bit_buf[0]-1]);
strcat(roma_buf,lut_100[num_bit_buf[1]-1]);
strcat(roma_buf,lut_10[num_bit_buf[2]-1]);
strcat(roma_buf,lut_1[num_bit_buf[3]-1]);
break;
}
case 3:
{
strcpy(roma_buf,lut_100[num_bit_buf[0]-1]);
strcat(roma_buf,lut_10[num_bit_buf[1]-1]);
strcat(roma_buf,lut_1[num_bit_buf[2]-1]);
break;
}
case 2:
{
strcpy(roma_buf,lut_10[num_bit_buf[0]-1]);
strcat(roma_buf,lut_1[num_bit_buf[1]-1]);
break;
}
case 1:
{
strcpy(roma_buf,lut_1[num_bit_buf[0]-1]);
//printf("src %s\n", lut_1[num_bit_buf[0]]);
//puts(roma_buf);
break;
}
}
return 0;
}
int main(int argc, char **argv)
{
char *p;
char roma_buf[20];
int number_input=strtol(argv[1], &p, 10);
if(argc!=2 || number_input > 3999){
printf("Usage: int2roma number(0-3999)\n");
return -1;
}
//printf("number_input is %d\n", number_input);
int_2_roma(number_input,roma_buf);
puts(roma_buf);
return 1;
}