Holey_yan

20150130_KUAS_VisualC++_RomaNumber

Jan 30th, 2015
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.70 KB | None | 0 0
  1. /**************************************/
  2. /** 20150130 Roma Number             **/
  3. /** Maker  : Yan                     **/
  4. /** E-Mail : [email protected] **/
  5. /** Date   : 2015/01/30 pm.11:30     **/
  6. /**************************************/
  7.  
  8. //Question from: http://zerojudge.tw/ShowProblem?problemid=a013
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <math.h>
  14.  
  15. char RomaWord[]   = {'M' , 'D', 'C', 'L', 'X', 'V', 'I'};
  16. int  RomaNumber[] = {1000, 500, 100,  50,  10,   5,   1};
  17.  
  18. //A function about how to get the value of input Roma word
  19. int _value(char inStr[]){
  20.     if(strlen(inStr) == 1){
  21.         for(int i = 0; i < strlen(RomaWord); i++)
  22.             if(inStr[0] == RomaWord[i])
  23.                 return RomaNumber[i];
  24.     }
  25.     else{
  26.         int number = 0;
  27.         for(int i = 0; i < strlen(inStr); i++){
  28.             int nowValue = 0, nextValue = -1;
  29.             for(int j = 0; j < sizeof(RomaWord); j++){
  30.                 //Find now Roma word value
  31.                 if(inStr[i] == RomaWord[j])
  32.                     nowValue = j;
  33.  
  34.                 //Find next Roma word value
  35.                 if(inStr[i + 1] == RomaWord[j])
  36.                     nextValue = j;
  37.             }
  38.  
  39.             //If it's the last letterm just add the number to [number]
  40.             if(i == strlen(inStr) - 1)
  41.                 number += RomaNumber[nowValue];
  42.             else
  43.                 if(nowValue <= nextValue)  //For example: CD --> add 400
  44.                     number += RomaNumber[nowValue];
  45.                 else{
  46.                     number += RomaNumber[nextValue] - RomaNumber[nowValue];
  47.                     i++;
  48.                 }
  49.         }
  50.         return number;
  51.     }
  52. }
  53.  
  54. int main(int argc, char const *argv[])
  55. {
  56.     system("cls"); //Clear windows
  57.  
  58.     //Start program
  59.     while(1){
  60.         char inA[100] = {NULL}, inB[100] = {NULL};
  61.         scanf("%s", inA);
  62.         //Judge [Is or Not] END
  63.         if(inA[0] == '#')
  64.             break;
  65.         else
  66.             scanf("%s", inB);
  67.  
  68.         //Get number of inA
  69.         int numberA = _value(inA);
  70.         printf("NumA: %d\n", numberA);
  71.  
  72.         //Get number of inB
  73.         int numberB = _value(inB);
  74.         printf("NumB: %d\n", numberB);
  75.  
  76.         //Prepare output
  77.         int outNumber = abs(numberA - numberB);
  78.         printf("Difference (ABS): %d\n", outNumber);
  79.         if(outNumber == 0)
  80.             printf("ZERO\n");
  81.         else{
  82.             char tmpOutStr[100] = {NULL}; //This just a temp output
  83.             int tmpOutStrCounter = 0;
  84.             for(int i = 0; i < sizeof(RomaWord); i++){
  85.                 while(outNumber / RomaNumber[i] != 0){
  86.                     outNumber -= RomaNumber[i];
  87.                     tmpOutStr[tmpOutStrCounter++] = RomaWord[i];
  88.                 }
  89.             }
  90.             printf("The   original answer: %s\n", tmpOutStr);
  91.  
  92.             //Make a repaired
  93.             char outStr[100] = {NULL};
  94.             int outStrCounter = 0;
  95.             for(int i = 0; i < strlen(tmpOutStr); i++){
  96.                 //If the letter index is the third-last, then do not have to check or repaired.
  97.                 //Just fill in the letter to [outStr].
  98.                 if(i > (strlen(tmpOutStr) - 3)){
  99.                     outStr[outStrCounter++] = tmpOutStr[i];
  100.                     continue;
  101.                 }
  102.                 else{
  103.                     for(int j = 0; j < sizeof(RomaWord); j++){
  104.                         if(tmpOutStr[i] == RomaWord[j]){
  105.                             //For example: DCCCC --> CM
  106.                             if((RomaWord[j + 1] == tmpOutStr[i + 1]) && (tmpOutStr[i + 1] == tmpOutStr[i + 2]) && \
  107.                                 (tmpOutStr[i + 2] == tmpOutStr[i + 3]) && (tmpOutStr[i + 3] == tmpOutStr[i + 4])){
  108.                                 i += 4; //Move [for] value
  109.                                 outStr[outStrCounter++] = RomaWord[j + 1];
  110.                                 outStr[outStrCounter++] = RomaWord[j - 1];
  111.                                 break;
  112.                             }
  113.                             //For example: CCCC --> CD
  114.                             else if((tmpOutStr[i] == tmpOutStr[i + 1]) && (tmpOutStr[i + 1] == tmpOutStr[i + 2]) && \
  115.                                     (tmpOutStr[i + 2] == tmpOutStr[i + 3])){
  116.                                 i += 3; //Move [for] value
  117.                                 outStr[outStrCounter++] = RomaWord[j];
  118.                                 outStr[outStrCounter++] = RomaWord[j - 1];
  119.                                 break;
  120.                             }
  121.                             else{
  122.                                 outStr[outStrCounter++] = tmpOutStr[i];
  123.                                 break;
  124.                             }
  125.                         }
  126.                     }
  127.                 }
  128.             }
  129.             printf("After repaired answer: %s\n", outStr);
  130.         }
  131.     }
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment