Bird
Raised Fist0
DSA Cprogramming~10 mins

Roman to Integer Conversion in DSA C - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to return the integer value of the Roman numeral 'I'.

DSA C
int romanToInt(char * s) {
    if (s[0] == 'I') {
        return [1];
    }
    return 0;
}
Drag options to blanks, or click blank then click option'
A1
B0
C10
D5
Attempts:
3 left
💡 Hint
Common Mistakes
Returning 0 instead of 1 for 'I'.
Confusing 'I' with 'V' or 'X'.
2fill in blank
medium

Complete the code to get the integer value of a single Roman numeral character.

DSA C
int value(char r) {
    switch(r) {
        case 'I': return 1;
        case 'V': return 5;
        case 'X': return 10;
        case 'L': return 50;
        case 'C': return 100;
        case 'D': return 500;
        case 'M': return 1000;
        default: return [1];
    }
}
Drag options to blanks, or click blank then click option'
A-1
B1
C0
D1000
Attempts:
3 left
💡 Hint
Common Mistakes
Returning -1 which may cause incorrect calculations.
Returning 1 which is a valid numeral value and may cause confusion.
3fill in blank
hard

Fix the error in the loop condition to correctly iterate over the string until the end.

DSA C
int romanToInt(char * s) {
    int total = 0;
    int i = 0;
    while (s[i] [1] '\0') {
        total += value(s[i]);
        i++;
    }
    return total;
}
Drag options to blanks, or click blank then click option'
A!=
B==
C<
D>
Attempts:
3 left
💡 Hint
Common Mistakes
Using '==' which stops immediately if first char is not '\0'.
Using '<' or '>' which are invalid for char comparison here.
4fill in blank
hard

Fill both blanks to correctly subtract when a smaller numeral precedes a larger one.

DSA C
int romanToInt(char * s) {
    int total = 0;
    int i = 0;
    while (s[i] != '\0') {
        int s1 = value(s[i]);
        if (s[i + 1] != '\0') {
            int s2 = value(s[i + 1]);
            if (s1 [1] s2) {
                total += s2 - s1;
                i += [2];
            } else {
                total += s1;
                i++;
            }
        } else {
            total += s1;
            i++;
        }
    }
    return total;
}
Drag options to blanks, or click blank then click option'
A<
B2
C>
D1
Attempts:
3 left
💡 Hint
Common Mistakes
Using '>' instead of '<' for comparison.
Incrementing i by 1 instead of 2 after subtraction.
5fill in blank
hard

Fill all three blanks to create a dictionary-like structure mapping Roman numerals to integers using arrays.

DSA C
typedef struct {
    char symbol;
    int value;
} RomanMap;

RomanMap map[] = {
    {'I', [1],
    {'V', [2],
    {'X', [3]
};
Drag options to blanks, or click blank then click option'
A1
B5
C10
D50
Attempts:
3 left
💡 Hint
Common Mistakes
Mixing up values for 'V' and 'X'.
Using incorrect integer values.

Practice

(1/5)
1. What is the main rule to convert Roman numerals to integers?
Example: IV = 4, VI = 6
easy
A. Multiply values of all symbols
B. Add values of symbols, subtract if a smaller symbol is before a larger one
C. Add values only if symbols are in alphabetical order
D. Subtract values of all symbols

Solution

  1. Step 1: Understand Roman numeral rules

    Roman numerals add values of symbols, but if a smaller symbol appears before a larger one, it is subtracted.
  2. Step 2: Apply rule to example

    For IV, I (1) is before V (5), so subtract 1 from 5 = 4. For VI, V (5) before I (1), so add 5 + 1 = 6.
  3. Final Answer:

    Add values of symbols, subtract if a smaller symbol is before a larger one -> Option B
  4. Quick Check:

    IV = 4, VI = 6 [OK]
Hint: Subtract when smaller symbol precedes larger one [OK]
Common Mistakes:
  • Always adding without subtraction
  • Multiplying symbols instead of adding
  • Ignoring order of symbols
2. Which of the following C code snippets correctly initializes a map for Roman numeral values?
easy
A. int values = {'I':1, 'V':5, 'X':10};
B. int values[] = {I=1, V=5, X=10};
C. int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10};
D. int values[3] = {1, 5, 10};

Solution

  1. Step 1: Understand C array initialization for character keys

    In C, to map characters to values, an array indexed by character offset is used, e.g., values['I'-'A'] = 1.
  2. Step 2: Check each option

    int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10}; uses correct syntax for sparse initialization. Options B and C use invalid syntax for C. int values[3] = {1, 5, 10}; initializes array without mapping to characters.
  3. Final Answer:

    int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10}; -> Option C
  4. Quick Check:

    Correct C syntax for char-indexed array [OK]
Hint: Use array with char offset for mapping in C [OK]
Common Mistakes:
  • Using dictionary syntax not valid in C
  • Not indexing array by character offset
  • Initializing array without specifying indices
3. What is the output of this C code snippet?
char *s = "MCMXCIV";
int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10, ['L'-'A']=50, ['C'-'A']=100, ['D'-'A']=500, ['M'-'A']=1000};
int result = 0, i = 0;
while (s[i]) {
  int curr = values[s[i]-'A'];
  int next = values[s[i+1]-'A'];
  if (next > curr) result -= curr;
  else result += curr;
  i++;
}
printf("%d", result);
medium
A. Error
B. 1904
C. 1494
D. 1994

Solution

  1. Step 1: Trace each character and apply addition/subtraction

    String: M(1000), C(100), M(1000), X(10), C(100), I(1), V(5). Check pairs:
    M(1000) next C(100) -> 100 < 1000? No, add 1000
    C(100) next M(1000) -> 1000 > 100, subtract 100
    M(1000) next X(10) -> 10 < 1000, add 1000
    X(10) next C(100) -> 100 > 10, subtract 10
    C(100) next I(1) -> 1 < 100, add 100
    I(1) next V(5) -> 5 > 1, subtract 1
    V(5) next 0, add 5
  2. Step 2: Calculate total

    1000 - 100 + 1000 - 10 + 100 - 1 + 5 = 1994
  3. Final Answer:

    1994 -> Option D
  4. Quick Check:

    MCMXCIV = 1994 [OK]
Hint: Subtract when next symbol is larger [OK]
Common Mistakes:
  • Adding all values without subtraction
  • Off-by-one error accessing next character
  • Incorrect mapping of Roman symbols
4. Find the bug in this C code for Roman to Integer conversion:
int romanToInt(char *s) {
  int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10, ['L'-'A']=50, ['C'-'A']=100, ['D'-'A']=500, ['M'-'A']=1000};
  int result = 0, i = 0;
  while (s[i]) {
    int curr = values[s[i]-'A'];
    int next = values[s[i+1]-'A'];
    if (curr < next) result += curr;
    else result -= curr;
    i++;
  }
  return result;
}
medium
A. The addition and subtraction logic is reversed
B. Array indexing causes out-of-bounds error
C. Values array is not initialized correctly
D. Function does not handle empty string

Solution

  1. Step 1: Analyze addition and subtraction conditions

    Code adds current value if curr < next, else subtracts. This is opposite of Roman rules where smaller before larger means subtract.
  2. Step 2: Correct logic

    It should subtract curr if curr < next, else add curr.
  3. Final Answer:

    The addition and subtraction logic is reversed -> Option A
  4. Quick Check:

    Subtract when smaller before larger [OK]
Hint: Subtract if current < next, else add [OK]
Common Mistakes:
  • Swapping add and subtract conditions
  • Ignoring last character's next value
  • Not initializing values array properly
5. Given the Roman numeral string "XLIX", which of the following C functions correctly returns its integer value?
hard
A. int romanToInt(char *s) { int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10, ['L'-'A']=50}; int res=0,i=0; while(s[i]) { int curr=values[s[i]-'A'], next=values[s[i+1]-'A']; if(curr
B. int romanToInt(char *s) { int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10, ['L'-'A']=50}; int res=0,i=0; while(s[i]) { int curr=values[s[i]-'A'], next=values[s[i+1]-'A']; if(curr>next) res-=curr; else res+=curr; i++; } return res; }
C. int romanToInt(char *s) { int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10, ['L'-'A']=50}; int res=0,i=0; while(s[i]) { int curr=values[s[i]-'A']; res+=curr; i++; } return res; }
D. int romanToInt(char *s) { int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10, ['L'-'A']=50}; int res=0,i=0; while(s[i]) { int curr=values[s[i]-'A'], next=values[s[i+1]-'A']; if(curr<=next) res-=curr; else res+=curr; i++; } return res; }

Solution

  1. Step 1: Check logic for subtraction and addition

    int romanToInt(char *s) { int values[26] = {['I'-'A']=1, ['V'-'A']=5, ['X'-'A']=10, ['L'-'A']=50}; int res=0,i=0; while(s[i]) { int curr=values[s[i]-'A'], next=values[s[i+1]-'A']; if(curr
  2. Step 2: Verify with example "XLIX"

    X(10) < L(50) subtract 10
    L(50) > I(1) add 50
    I(1) < X(10) subtract 1
    X(10) no next add 10
    Total = -10 + 50 - 1 + 10 = 49
  3. Final Answer:

    Option A correctly returns 49 for "XLIX" -> Option A
  4. Quick Check:

    Subtract if smaller before larger [OK]
Hint: Subtract if current < next, else add [OK]
Common Mistakes:
  • Using <= instead of < for subtraction
  • Adding all values without subtraction
  • Incorrect comparison operators
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard