2014-11-06 135 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)