#7997: Java 的程式碼, 求更快的方法


z1zz1zz1z (1646408640)

學校 : 臺北市立建國高級中學
編號 : 19214
來源 : [140.112.16.159]
最後登入時間 :
2013-07-31 21:28:46
a013. 羅馬數字 -- NPSC 模擬試題 | From: [123.194.140.144] | 發表日期 : 2013-07-23 23:27

public class A013 {
    public static void main ( String[] args ) {
        Scanner scanner = new Scanner ( System.in );
        String input1 , input2;
        while ( ! ( input1 = scanner.next ( ) ).equals ( "#" ) ) {
            input2 = scanner.next ( );
            System.out.println ( toRome ( Math.abs ( toInt ( input1 ) - toInt ( input2 ) ) ) );
        }
    }
    private static int toInt ( String s ) {
        int result = 0;
        int sLen = s.length ( );
        for( int i=0 ; i < sLen ; i++ ) {
            char nCh = ' ';
            if ( i != sLen - 1 )
                nCh = s.charAt ( i+1 );
            switch ( s.charAt ( i ) ) {
                case 'I' :
                    if ( nCh == 'I' || nCh == ' ' )
                        result += 1;
                    else
                        result -= 1;
                    break;
                case 'V' :
                    result += 5;
                    break;
                case 'X' :
                    if ( nCh == 'I' || nCh == 'V' || nCh == 'X' || nCh == ' ' )
                        result += 10;
                    else
                        result -= 10;
                    break;
                case 'L' :
                    result += 50;
                    break;
                case 'C' :
                    if ( nCh == 'M' || nCh == 'D' || nCh == ' ' )
                        result -= 100;
                    else
                        result += 100;
                    break;
                 case 'D' :
                    result += 500;
                    break;
                 case 'M' :
                    result += 1000;
                    break;
            }
        }
        System.out.println ( result );
        return result;
    }
    private static String toRome ( int n ) {
        String result = "";
        if ( n == 0 )
            return "ZERO";
        while ( n !=0 ) {
            if ( n >= 1000 ) {
                result += "M";
                n -= 1000;
            }
            else if ( 1000 > n && n >= 900 ) {
                result += "CM";
                n -= 900;
            }
            else if ( 900 > n && n >= 500 ) {
                result += "D";
                n -= 500;
            }
            else if ( 500 > n && n >= 400 ) {
                result += "CD";
                n -= 400;
            }
            else if ( 400 > n && n>= 100 ) {
                result += "C";
                n -= 100;
            }
            else if ( 100 > n && n>= 90 ) {
                result += "XC";
                n -= 90;
            }
            else if ( 90 > n && n >= 50 ) {
                result += "L";
                n -= 50;
            }
            else if ( 50 > n && n >= 40 ) {
                result += "XL";
                n -= 40;
            }
            else if ( 40 > n && n >=10 ) {
                result += "X";
                n -= 10;
            }
            else if ( n == 9 ) {
                result += "IX";
                n -= 9;
            }
            else if ( 9 > n && n >= 5 ) {
                result += "V";
                n -= 5;
            }
            else if ( n == 4 ) {
                result += "IV";
                n -= 4;
            }
            else {
                result += "I";
                n -= 1;
            }
        }
        System.out.println ( result );
        return result;
    }
}
 
#7998: Re:Java 的程式碼, 求更快的方法


z1zz1zz1z (1646408640)

學校 : 臺北市立建國高級中學
編號 : 19214
來源 : [140.112.16.159]
最後登入時間 :
2013-07-31 21:28:46
a013. 羅馬數字 -- NPSC 模擬試題 | From: [123.194.140.144] | 發表日期 : 2013-07-24 10:40

有哪裡很難看懂

或哪裡效能可以改進嗎? 

 
#8154: Re:Java 的程式碼, 求更快的方法


tripleH (tripleH)

學校 : 不指定學校
編號 : 34180
來源 : [1.173.207.100]
最後登入時間 :
2013-10-11 20:02:59
a013. 羅馬數字 -- NPSC 模擬試題 | From: [1.173.194.8] | 發表日期 : 2013-09-05 20:30

有哪裡很難看懂

或哪裡效能可以改進嗎?  

稍微改了幾行判斷式
 
private static int toInt ( String s ){
int sum = 0;
char ch;
for(int i = 0; i<s.length() ; i++){
  ch = ' '; 
  if(i!=(s.length())-1) 
ch = s.charAt(i+1);
  switch(s.charAt(i)){
case 'I':
  if(ch == 'V' || ch == 'X') 
sum -= 1;
  else
sum += 1;
break;
case 'V':
sum += 5; 
break;
case 'X':
  if(ch == 'L' || ch == 'C')
sum -= 10;
  else
sum += 10;
break;
case 'L':
sum += 50;
break;
case 'C':
  if(ch == 'D' || ch == 'M')
sum -= 100;
  else
sum += 100;
break;
case 'D':
sum += 500;
break;
case 'M':
sum += 1000;
break;
  }
}
return sum;
   }

   private static String toRoma ( int n ){
String msg = "";
while(n != 0){
  if(n>=1000){
msg += "M";
n -= 1000;}
  else if(n>=900 ){
msg += "CM";
n -= 900;}
  else if(n>=500){
msg += "D";
n -= 500;}
  else if(n>=400){
msg += "CD";
n -= 400;}
  else if(n>=100){
msg += "C";
n -= 100;}
  else if(n>=90){
msg += "XC";
n -= 90;}
  else if(n>=50){
msg += "L";
n -= 50;}
  else if(n>=40){
msg += "XL";
n -= 40;}
  else if(n>=10){
msg += "X";
n -= 10;}
  else if(n==9){
msg += "IX";
n -= 9;}
  else if(n>=5){
msg += "V";
n -= 5;}
  else if(n==4){
msg += "IV";
n -= 4;}
  else if(n>0){
msg += "I";
n -= 1;}
}
return msg;
   }

 
ZeroJudge Forum