我正在尝试将整数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
答案 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
函数。不幸的是,除了标量罗马数字之外,这本身并不起作用。您需要使用arrayfun
或for
循环:
arrayfun(@char,numerals,'UniformOuput',false)