LeetCode-12.整数转化成罗马数字 & LeetCode-13.罗马数字转化成整数


一、整数转化成罗马数字

1. 参考: https://www.jb51.net/article/217252.htm

2. C实现

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))

int intToRoman(int num)
{
    int arr[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    char *str[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    char rom[256] = {0};
    int sz = ARRAY_SIZE(arr);
    int i, idx=0;

    for (i = 0; i < sz; i++) {
        while (num >= arr[i]) {
            num -= arr[i];
            idx += sprintf(rom+idx, "%s", str[i]); //sprintf(char *str, const char *format, ...);
        }
    }
    printf("rom=%s\n", rom);

    return 0;
}

int main()
{
    intToRoman(1437); //rom=MCDXXXVII
    
    return 0;
}

//3437==MMMCDXXXVI


二、罗马数字转化成整数

1. 参考: https://www.jb51.net/article/217253.htm

2. 实现

#include <stdio.h>
#include <string.h>

#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))

int roman_val(char c)
{
    int i, val = 0;
    int arr[][2] = {{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};

    for (i = 0; i < ARRAY_SIZE(arr); i++) {
        if (c == arr[i][0]) {
            val = arr[i][1];
        }
    }

    return val;
}

int roman_to_int(const char *str)
{
    int i, res = 0;
    int sz = strlen(str);

    for (i = 0; i < sz; i++) {
        if ((i == sz-1) || roman_val(str[i]) >= roman_val(str[i+1]))
            res += roman_val(str[i]);
        else
            res -= roman_val(str[i]);
    }

    return res;
}

//1437==MCDXXXVII


int main()
{
    const char *str = "MCDXXXVII";
    int val;

    val    = roman_to_int(str);

    printf("str=%s, val=%d\n", str, val);
    
    return 0;
}

数字转罗马,可以将其拆开来加减,没有将 CD 强制看成一个整体,要将人类思维向计算机思维抽象。

 

posted on 2025-02-14 14:59  Hello-World3  阅读(9)  评论(0)    收藏  举报

导航