0

我正在尝试将整数x(0<=x<=3999) 转换为 Roman numeric 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
4

2 回答 2

1

根据这篇文章,这是一个 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'       
       .
       .
于 2014-11-06T05:42:26.193 回答
0

这可能对您的程序没有帮助,但它可能对测试/验证您的结果有用。output::roman在 Matlab R2012b 及更高版本中,符号数学工具箱中的 MuPAD 可以使用该功能处理罗马数字。您可以在 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函数。不幸的是,除了标量罗马数字之外,这本身不起作用。您需要使用arrayfunorfor循环:

arrayfun(@char,numerals,'UniformOuput',false)
于 2014-11-06T06:49:06.127 回答