i***d 发帖数: 28 | 1 大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊?
能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了! | p*****2 发帖数: 21240 | 2 import java.io.*;
import java.util.*;
public class Roman
{
public static void main(String[] args)
{
new Roman().run();
}
PrintWriter out = null;
void run()
{
Scanner in = new Scanner(System.in);
out = new PrintWriter(System.out);
String s = in.next();
out.println(romanToInt(s));
out.close();
}
public String intToRoman(int num)
{
StringBuffer sb = new StringBuffer();
sb.append(Convert(num, 1000, new char[]
{ 'M', 0, 0 }));
num %= 1000;
sb.append(Convert(num, 100, new char[]
{ 'C', 'D', 'M' }));
num %= 100;
sb.append(Convert(num, 10, new char[]
{ 'X', 'L', 'C' }));
num %= 10;
sb.append(Convert(num, 1, new char[]
{ 'I', 'V', 'X' }));
return sb.toString();
}
String Convert(int num, int base, char[] letters)
{
num /= base;
if (num == 0)
return "";
StringBuffer sb = new StringBuffer();
if (num == 9)
{
sb.append(letters[0]);
sb.append(letters[2]);
}
else if (num >= 5)
{
sb.append(letters[1]);
for (int i = 6; i <= num; i++)
sb.append(letters[0]);
}
else if (num == 4)
{
sb.append(letters[0]);
sb.append(letters[1]);
}
else
{
for (int i = 1; i <= num; i++)
sb.append(letters[0]);
}
return sb.toString();
}
HashMap hm = new HashMap();
void Init()
{
if (hm.size() == 0)
{
hm.put("I", 1);
hm.put("IV", 4);
hm.put("V", 5);
hm.put("IX", 9);
hm.put("X", 10);
hm.put("XL", 40);
hm.put("L", 50);
hm.put("XC", 90);
hm.put("C", 100);
hm.put("CD", 400);
hm.put("D", 500);
hm.put("CM", 900);
hm.put("M", 1000);
}
}
public int romanToInt(String s)
{
Init();
int ret = 0;
int i = 0;
while (i < s.length())
{
if (i + 1 < s.length() && hm.containsKey(s.substring(i, i + 2)))
{
ret += hm.get(s.substring(i, i + 2));
i += 2;
}
else
{
ret += hm.get(s.substring(i, i + 1));
i++;
}
}
return ret;
}
} | l*****a 发帖数: 14598 | 3 so long
不看
【在 p*****2 的大作中提到】 : import java.io.*; : import java.util.*; : public class Roman : { : public static void main(String[] args) : { : new Roman().run(); : } : PrintWriter out = null; : void run()
| l*****a 发帖数: 14598 | 4 突然发现你怎么什么程序都弄一个.Run(0 method..
【在 p*****2 的大作中提到】 : import java.io.*; : import java.util.*; : public class Roman : { : public static void main(String[] args) : { : new Roman().run(); : } : PrintWriter out = null; : void run()
| p*****2 发帖数: 21240 | 5
你多看看java吧。
【在 l*****a 的大作中提到】 : so long : 不看
| p*****2 发帖数: 21240 | 6
学的。呵呵。
【在 l*****a 的大作中提到】 : 突然发现你怎么什么程序都弄一个.Run(0 method..
| w****x 发帖数: 2483 | 7 面试这题我直接投降, 罗马转阿拉伯数字的规律别说写程序, 我弄清楚都要花2小时 | k*****y 发帖数: 744 | 8 从右往左读,每次看两位。如果右边大,就是差,不然就是和。
int getNumber(char c){
switch(c){
case 'I':return 1;
case 'V':return 5;
case 'X':return 10;
case 'L':return 50;
case 'C':return 100;
case 'D':return 500;
case 'M':return 1000;
}
return 0;
}
int romanToInt(string s) {
int pos = s.length()-1;
int sum = 0;
while(pos>=0){
int right = getNumber(s[pos]);
int left = INT_MAX;
if(pos)
left = getNumber(s[pos-1]);
if(left < right){
sum += right -left;
pos -= 2;
}
else{
sum += right;
--pos;
}
}
return sum;
}
【在 i***d 的大作中提到】 : 大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊? : 能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了!
| k*****y 发帖数: 744 | 9 string intToRoman(int num) {
char Roman[] = {'I', //1
'V', //5
'X', //10
'L', //50
'C', //100
'D', //500
'M'}; //1000
string ans;
if(num >= 4000 || num <= 0) return ans;
stack digits;
while(num){
digits.push(num%10);
num/=10;
}
int offset=digits.size()*2-2;
while(digits.size()){
int lastDigit = digits.top();
digits.pop();
if(lastDigit == 4){
ans += Roman[offset]; //-1
ans += Roman[offset+1]; //5
}
else if(lastDigit == 9){
ans += Roman[offset]; //-1
ans += Roman[offset+2]; //10
}
else{
if(lastDigit >= 5)
ans += Roman[offset+1]; //5
for(int i=0; i
ans += Roman[offset]; //1s
}
}
offset -= 2;
}
return ans;
}
【在 i***d 的大作中提到】 : 大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊? : 能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了!
| S**I 发帖数: 15689 | 10 楼上的全是Java,俺来一个C的吧(各种exception懒得写了):
#include
int getDecimal(char);
int romanToDecimal(char *);
char getRoman(int);
char * decimalToRoman(int, char *);
int main(int argc, char* argv[]){
printf("Roman: %s\n", argv[1]);
int d = romanToDecimal(argv[1]);
printf("Decimal: %d\n", d);
char r[1000];
decimalToRoman(d, r);
printf("Roman: %s\n", r);
}
int getDecimal(char a){
switch(a){
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
}
return 0;
}
int romanToDecimal(char * r){
int d1 = getDecimal(*r), d2 = getDecimal(*++r), d = 0;
while(1){
if(d1 >= d2){
d += d1;
}
else{
d -= d1;
}
if(d2 == 0){
break;
}
d1 = d2;
d2 = getDecimal(*++r);
}
return d;
}
char getRoman(int d){
switch(d){
case 1:
return 'I';
case 5:
return 'V';
case 10:
return 'X';
case 50:
return 'L';
case 100:
return 'C';
case 500:
return 'D';
case 1000:
return 'M';
}
return '\0';
}
char * digitToRoman(int digit, int base, char * r){
if(digit <= 3){
while(digit > 0){*r++ = getRoman(base); digit--;}
}
else if(digit == 4){
*r++ = getRoman(base);
*r++ = getRoman(5 * base);
}
else if(digit == 5){
*r++ = getRoman(5 * base);
}
else if(digit <= 8){
*r++ = getRoman(5 * base);
digit -= 5;
while(digit > 0){*r++ = getRoman(base); digit--;}
}
else if(digit == 9){
*r++ = getRoman(base);
*r++ = getRoman(10 * base);
}
return r;
}
char * decimalToRoman(int d, char * r){
int digit = d / 1000;
d %= 1000;
while(digit > 0){
*r++ = getRoman(1000);
digit--;
}
digit = d / 100;
d %= 100;
r = digitToRoman(digit, 100, r);
digit = d / 10;
d %= 10;
r = digitToRoman(digit, 10, r);
r = digitToRoman(d, 1, r);
*r = '\0';
return r;
}
【在 i***d 的大作中提到】 : 大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊? : 能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了!
| | | g****e 发帖数: 172 | 11 好多计算机书上的例子就是。。
【在 i***d 的大作中提到】 : 大牛们有谁写过罗马数字转换成十进制和十进制转换成罗马数字的啊? : 能不能帮忙贴一下,写了一个下午,还是没有思路。先谢谢了!
| i***d 发帖数: 28 | | c*****e 发帖数: 3226 | | H****r 发帖数: 2801 | 14 兔爷开搞java啦?难道从了facebook?
【在 p*****2 的大作中提到】 : import java.io.*; : import java.util.*; : public class Roman : { : public static void main(String[] args) : { : new Roman().run(); : } : PrintWriter out = null; : void run()
| p*****2 发帖数: 21240 | 15
看了一下这帖子是F锯了我没多久写的吧? 当时还没做leetcode呢。
【在 H****r 的大作中提到】 : 兔爷开搞java啦?难道从了facebook?
| H****r 发帖数: 2801 | 16 唉,的确没看时间
【在 p*****2 的大作中提到】 : : 看了一下这帖子是F锯了我没多久写的吧? 当时还没做leetcode呢。
| x*****p 发帖数: 1707 | 17 See the code in Java.
【在 i***d 的大作中提到】 : 谢谢,大牛们的帮助!
| e***s 发帖数: 799 | 18 我贴个C#的吧,不过前面要自己顶一个一个lookup table
public static int RomantoInteger(string s)
{
int ret = 0;
if (s.Length == 0)
return ret;
string num1 = "";
string num10 = "";
string num100 = "";
string num1000 = "";
for (int i = 0; i < s.Length; i++)
{
if (s[i] == 'I' || s[i] == 'V')
{
num1 = s.Substring(i);
break;
}
if (s[i] == 'X' || s[i] == 'L' || (num10 != "" && s[i] == 'C
'))
{
num10 += s[i];
continue;
}
if (s[i] == 'C' || s[i] == 'D' || (num100 != "" && s[i] == '
M'))
{
num100 += s[i];
continue;
}
if (s[i] == 'M')
num1000 += s[i];
}
ret += num1000.Length * 1000;
for (int i = 0; i < D100.Length; i++)
{
if (num100 == D100[i])
{
ret += (i + 1) * 100;
break;
}
}
for (int i = 0; i < D10.Length; i++)
{
if (num10 == D10[i])
{
ret += (i + 1) * 10;
break;
}
}
for (int i = 0; i < D1.Length; i++)
{
if (num1 == D1[i])
{
ret += (i + 1);
break;
}
}
return ret;
} |
|