2014-11-06 122 views
0

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

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

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 
+0

您会得到什么错误?你读过它吗?如果仔细阅读,Matlab错误非常有用。 – David 2014-11-06 05:04:05

+0

我收到了这条消息...您的输出y =(空白)预期输出y_cor = VII – Grace 2014-11-06 05:14:46

+0

我在代码中没有看到'y_cor'变量。此外,你的代码甚至不会为我运行,所以别的是错误的。 – David 2014-11-06 05:26:04

回答

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'  
     . 
     . 
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)