Matlab将整数转换为罗马字母

时间:2014-11-06 05:03:16

标签: matlab roman-numerals

我正在尝试将整数x(0 <= x <= 3999)转换为罗马数字y

我为此编写了代码,但是在运行时我一直收到错误。 这段代码有什么问题?

C1=['','M','MM','MMM'];
C2=['','C','CC','CCC','D','DC','DCC','DCCC','CM'];
C3=['','X','XX','XXX','XL','L','LX','LXX','LXXX','XC'];
C4=['','I','II','IV','V','VI','VII','VIII','IX'];

x=0;
for i4=1:4;
    for i3=1:9;
        for i2=1:9;
            for i1=1:9;
                if x==0
                    y='';
                else
                    y=[C1{i4} C2{i3} C3{i2} C4{i1}];
                    x=x+1;
                end
            end
        end
    end
end

2 个答案:

答案 0 :(得分:1)

基于this post,这是一个MATLAB版本:

function str = num2roman(x)
    assert(isscalar(x) && floor(x)==x);
    assert(1 <= x && x <= 3999);

    numbers = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
    letters = {'M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'};

    str = '';
    num = x;
    for i=1:numel(numbers)
        while (num >= numbers(i))
            str = [str letters{i}];
            num = num - numbers(i);
        end
    end
end

以下是转换为罗马数字的整个数字范围:

>> x = (1:3999).';
>> xx = arrayfun(@num2roman, x, 'UniformOutput',false);
>> table(x, xx, 'VariableNames',{'integer','roman_numeral'})
ans = 
    integer      roman_numeral  
    _______    _________________
       1       'I'              
       2       'II'             
       3       'III'            
       4       'IV'             
       5       'V'              
       6       'VI'             
       7       'VII'            
       8       'VIII'           
       9       'IX'             
      10       'X'       
       .
       .

答案 1 :(得分:0)

这可能对您的程序没有帮助,但它可能对测试/验证结果很有用。在Matlab R2012b及更高版本中,符号数学工具箱中的MuPAD可以使用output::roman函数处理罗马数字。在Matlab中使用它的一种方法是通过以下向量化匿名函数:

toRoman @(n)feval(symengine,'map',n,'output::roman');

然后numerals = toRoman((1:12).')返回:

   I
  II
 III
  IV
   V
  VI
 VII
VIII
  IX
   X
  XI
 XII

输出为类sym。如果要转换为字符串的单元格数组,可以使用char函数。不幸的是,除了标量罗马数字之外,这本身并不起作用。您需要使用arrayfunfor循环:

arrayfun(@char,numerals,'UniformOuput',false)