#33570: C語言函式解


zongyan988@gmail.com (肥宅麵)

學校 : 不指定學校
編號 : 152080
來源 : [42.78.18.30]
最後登入時間 :
2024-04-14 03:03:00
a013. 羅馬數字 -- NPSC 模擬試題 | From: [114.32.212.131] | 發表日期 : 2023-01-13 00:14

比起暴力破解法,這個方法可能更嚴謹一點,不過我也不敢說是最好的方法,我就分享一下我用的函式。

首先是處理輸入的函式:

int convertInput(char input[])
{
  int value=0;
  for(int i=strlen(input)-1;i>=0;i--)
  {
    if(input[i]=='I') //是I的話,檢查右邊有沒有X或V
    {
      if(input[i+1]=='X')
        value--;
      else if(input[i+1]=='V')
        value--;
      else
        value++;
    }
    else if(input[i]=='V')
      value+=5;
    else if(input[i]=='X') //是X的話,檢查右邊有沒有C或L
    {
      if(input[i+1]=='C')
        value-=10;
      else if(input[i+1]=='L')
        value-=10;
      else
        value+=10;
    }
    else if(input[i]=='L')
      value+=50;
    else if(input[i]=='C') //是C的話,檢查右邊有沒有M或D
    {
      if(input[i+1]=='M')
        value-=100;
      else if(input[i+1]=='D')
        value-=100;
      else
        value+=100;
    }
    else if(input[i]=='D')
      value+=500;
    else if(input[i]=='M')
      value+=1000;
  }
  return value;
}

(沒註解就是正常處理。)

因為會有例外的只有I,X,C,所以只要針對這三個去做前後判斷就好了 (加減不會存在跨位,只會發生在前後一位),這裡我是用右到左,小到大的方法。

再來是用來轉換輸出的函式:

void convertOutput(int value)
{
  while(value>0)
  {
    for(int i=0;i<value/1000;i++) //確認M的數量
      printf("M");
    value%=1000;
    if(value/900==1) //確認CM的數量
      printf("CM");
    value%=900;
    for(int i=0;i<value/500;i++) //確認D的數量
      printf("D");
    value%=500;
    if(value/400==1) //確認CD的數量
      printf("CD");
    value%=400;
    for(int i=0;i<value/100;i++) //確認C的數量
      printf("C");
    value%=100;
    if(value/90==1) //確認XC的數量
      printf("XC");
    value%=90;
    for(int i=0;i<value/50;i++) //確認L的數量
      printf("L");
    value%=50;
    if(value/40==1) //確認XL的數量
      printf("XL");
    value%=40;
    for(int i=0;i<value/10;i++) //確認X的數量
      printf("X");
    value%=10;
    if(value/9==1) //確認IX的數量
      printf("IX");
    value%=9;
    for(int i=0;i<value/5;i++) //確認V的數量
      printf("V");
    value%=5;
    if(value/4==1) //確認IV的數量
      printf("IV");
    value%=4;
    for(int i=0;i<value/1;i++) //確認I的數量
      printf("I");
    value%=1;
  }
  printf("\n");
}

這裡我用void函式直接輸出,直接把絕對值丟進去跑就好了,處理就秉持一個從大到小的原則 (輸出要記得CM,CD,XC之類的要分開)。

再來就是主函式:

int main()
{
    int value1,value2;
    char input1[20],input2[20];
    while(scanf("%s",input1)!=EOF)
    {
      if(input1[0]=='#')
        break;
      scanf(" %s",input2);
      value1=convertInput(input1);
      value2=convertInput(input2);

      if(value1>value2)
      {
        int sum=value1-value2;
        convertOutput(sum);
      }
      else if(value1<value2)
      {
        int sum=value2-value1;
        convertOutput(sum);
      }
      else if(value1==value2)
        printf("ZERO\n");
  }
}

用了函式後的主函式真的精簡很多,而且交給函式處理比較不會有衝突的問題,推推。

 
ZeroJudge Forum