本文主要是介绍《leetCode》:Integer to Roman,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.
思路
由于罗马数字就是由”个“”十“、”百“拼凑而来。因此我们只需要将下面几张表存储起来,然后查表即可
【罗马数字】1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};1000~3000: {"M", "MM", "MMM"}.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
char oneStr[9][5]= {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
char tenStr[9][5]={"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
char hundredStr[9][5]={"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
char thStr[3][5]={"M", "MM", "MMM"};int my_integerLen(int x){int len=0;while(x!=0){len++;x/=10;}return len;
}
char *strPoint(int len,int temp){switch(len){case 1:return oneStr[temp-1];case 2:return tenStr[temp-1];case 3:return hundredStr[temp-1];case 4:return thStr[temp-1];}
}
char* intToRoman(int num) {char *str;int len=my_integerLen(num);bool flag=true;while(num!=0){int temp=num/(pow(10,len-1));char *str1=strPoint(len,temp);//返回该位代表的字符串 if(flag){//第一次进行复制,之后进行连接str=(char *)malloc((strlen(str1)+1)*sizeof(char));strcpy(str,str1);flag=false;}else{strcat(str,str1);//copy到str中。 }//更新x和其长度 num%=((int)(pow(10,len-1)));len=my_integerLen(num);}return str;
}int main(void){int num;while(scanf("%d",&num)!=EOF){char *str=intToRoman(num);puts(str);}return 0;
}
这篇关于《leetCode》:Integer to Roman的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!