#16224: bash shell


a0983095871@gmail.com (Lesson One)

學校 : 不指定學校
編號 : 73922
來源 : [1.168.170.69]
最後登入時間 :
2023-11-26 17:44:09
a013. 羅馬數字 -- NPSC 模擬試題 | From: [111.246.64.98] | 發表日期 : 2018-12-08 16:15

#!/bin/bash
# your code goes here
declare -A rti #羅馬數字轉阿拉伯數字轉換表
rti+=(["I"]=1 ["IV"]=4 ["V"]=5 ["IX"]=9 ["X"]=10 ["XL"]=40 ["L"]=50 ["XC"]=90 \
["C"]=100 ["CD"]=400 ["D"]=500 ["CM"]=900 ["M"]=1000)
declare -A itr #阿拉伯數字轉羅馬數字轉換表
itr+=(["1"]=I ["4"]=IV ["5"]=V ["9"]=IX ["10"]=X ["40"]=XL ["50"]=L ["90"]=XC \
["100"]=C ["400"]=CD ["500"]=D ["900"]=CM ["1000"]=M)
passvar= #romtoint的傳遞參數
function romtoint () { #羅馬數字字串轉阿拉伯數字
    sum=0
    tmp=$1
    while [ ! -z "$tmp" ]; do #當字串不為空的時候
   	 if [ ${rti[${tmp:0:1}]} -lt ${rti[${tmp:1:1}]} >/dev/null 2>&1 ]; then #每次比較第一個和第二個字元轉換後的大小關係
   		 sum=$((sum + ${rti[${tmp:0:2}]})) #若後者比前者大,那麼視為兩個一組看待
   		 tmp=${tmp:2}
   	 else
   		 sum=$((sum + ${rti[${tmp:0:1}]})) #反之,視為一組看待
   		 tmp=${tmp:1}
   	 fi
    done
    passvar=$sum
}
passvar2=
modtest=(1000 900 500 400 100 90 50 40 10 9 5 4 1)
function inttorom () { #阿拉伯數字轉羅馬數字字串
    res=
    tmp=$1
    count=0
    for i in `seq 0 13`; do #依序從1000開始扣除
   	 while [ $tmp -ge ${modtest[$i]} 2>/dev/null ]; do #直到那個單位不能再扣除為止
   		 tmp=$((tmp - ${modtest[$i]}))
   		 count=$((count + 1))
   	 done
   	 if [ $count -gt 0 ]; then #當次數大於0才需要顯示
   		 for j in `seq 1 $count`; do
   			 res=`echo "$res${itr[${modtest[$i]}]}"` #結果字串串接
   		 done
   	 fi
   	 count=0 #重置計算
    done
    passvar2=$res
}
while read fst snd; do
    if [ "$fst" == "#" ]; then
   	 break
    else
   	 if [ "$fst" == "$snd" ]; then
   		 echo "ZERO"
   	 else
   		 romtoint $fst
   		 fst=$passvar
   		 romtoint $snd
   		 snd=$passvar
   		 dif=$((fst - snd))
   		 dif=`echo $dif | tr -d -` #取絕對值
   		 inttorom $dif
   		 echo $passvar2
   	 fi
    fi
done
 
ZeroJudge Forum