Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**************************************/
- /** 20150130 Roma Number **/
- /** Maker : Yan **/
- /** E-Mail : [email protected] **/
- /** Date : 2015/01/30 pm.11:30 **/
- /**************************************/
- //Question from: http://zerojudge.tw/ShowProblem?problemid=a013
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- char RomaWord[] = {'M' , 'D', 'C', 'L', 'X', 'V', 'I'};
- int RomaNumber[] = {1000, 500, 100, 50, 10, 5, 1};
- //A function about how to get the value of input Roma word
- int _value(char inStr[]){
- if(strlen(inStr) == 1){
- for(int i = 0; i < strlen(RomaWord); i++)
- if(inStr[0] == RomaWord[i])
- return RomaNumber[i];
- }
- else{
- int number = 0;
- for(int i = 0; i < strlen(inStr); i++){
- int nowValue = 0, nextValue = -1;
- for(int j = 0; j < sizeof(RomaWord); j++){
- //Find now Roma word value
- if(inStr[i] == RomaWord[j])
- nowValue = j;
- //Find next Roma word value
- if(inStr[i + 1] == RomaWord[j])
- nextValue = j;
- }
- //If it's the last letterm just add the number to [number]
- if(i == strlen(inStr) - 1)
- number += RomaNumber[nowValue];
- else
- if(nowValue <= nextValue) //For example: CD --> add 400
- number += RomaNumber[nowValue];
- else{
- number += RomaNumber[nextValue] - RomaNumber[nowValue];
- i++;
- }
- }
- return number;
- }
- }
- int main(int argc, char const *argv[])
- {
- system("cls"); //Clear windows
- //Start program
- while(1){
- char inA[100] = {NULL}, inB[100] = {NULL};
- scanf("%s", inA);
- //Judge [Is or Not] END
- if(inA[0] == '#')
- break;
- else
- scanf("%s", inB);
- //Get number of inA
- int numberA = _value(inA);
- printf("NumA: %d\n", numberA);
- //Get number of inB
- int numberB = _value(inB);
- printf("NumB: %d\n", numberB);
- //Prepare output
- int outNumber = abs(numberA - numberB);
- printf("Difference (ABS): %d\n", outNumber);
- if(outNumber == 0)
- printf("ZERO\n");
- else{
- char tmpOutStr[100] = {NULL}; //This just a temp output
- int tmpOutStrCounter = 0;
- for(int i = 0; i < sizeof(RomaWord); i++){
- while(outNumber / RomaNumber[i] != 0){
- outNumber -= RomaNumber[i];
- tmpOutStr[tmpOutStrCounter++] = RomaWord[i];
- }
- }
- printf("The original answer: %s\n", tmpOutStr);
- //Make a repaired
- char outStr[100] = {NULL};
- int outStrCounter = 0;
- for(int i = 0; i < strlen(tmpOutStr); i++){
- //If the letter index is the third-last, then do not have to check or repaired.
- //Just fill in the letter to [outStr].
- if(i > (strlen(tmpOutStr) - 3)){
- outStr[outStrCounter++] = tmpOutStr[i];
- continue;
- }
- else{
- for(int j = 0; j < sizeof(RomaWord); j++){
- if(tmpOutStr[i] == RomaWord[j]){
- //For example: DCCCC --> CM
- if((RomaWord[j + 1] == tmpOutStr[i + 1]) && (tmpOutStr[i + 1] == tmpOutStr[i + 2]) && \
- (tmpOutStr[i + 2] == tmpOutStr[i + 3]) && (tmpOutStr[i + 3] == tmpOutStr[i + 4])){
- i += 4; //Move [for] value
- outStr[outStrCounter++] = RomaWord[j + 1];
- outStr[outStrCounter++] = RomaWord[j - 1];
- break;
- }
- //For example: CCCC --> CD
- else if((tmpOutStr[i] == tmpOutStr[i + 1]) && (tmpOutStr[i + 1] == tmpOutStr[i + 2]) && \
- (tmpOutStr[i + 2] == tmpOutStr[i + 3])){
- i += 3; //Move [for] value
- outStr[outStrCounter++] = RomaWord[j];
- outStr[outStrCounter++] = RomaWord[j - 1];
- break;
- }
- else{
- outStr[outStrCounter++] = tmpOutStr[i];
- break;
- }
- }
- }
- }
- }
- printf("After repaired answer: %s\n", outStr);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment