将罗马数字转换为整数

use*_*682 3 matlab

对于计算机科学作业,我的目标是将字符串(罗马数字)转换为整数.我要在Matlab中编写一个函数来完成这个.我的代码如下所示.

function [x] = roman2decimal(s)
s1 = substr1(s,1);
s2 = substr2(s,2,2);
s = substr2(s, 3, numel(s));
sum = 0;
if (s1~='')
%Case I - if any of these conditions are true
if (s1=='C' && s2=='M')
    sum = sum + 900;
end
if (s1=='C' && s2=='D')
    sum = sum + 400;
end
if (s1=='X' && s2=='C')
    sum = sum + 90;
end
if (s1=='X' && s2=='L')
    sum = sum + 40;
end
if (s1=='I' && s2=='X')
    sum = sum + 9;
end
if (s1=='I' && s2=='V')
    sum = sum + 4;
end
s=s1
s2=substr2(s, 3, numel(s))

end

% case 2 - no case 1 conditions were true
if(s1=='M')
    sum = sum + 1000;
end

if(s1=='D')
    sum = sum + 500;
end

if(s1=='C')
    sum = sum + 100;
end

if(s1=='L')
    sum = sum + 50;
end

if(s1=='X')
    sum = sum + 10;
end

if(s1=='V')
    sum = sum + 5;
end

if(s1=='I')
    sum = sum + 1;
end
s1=s2
s=s2
sum
end


function [c]=substr1(s,pos)
if(pos >= 1 && numel(s) >= pos) c=s(pos);
else c='';
end
end % substr1

function [c]=substr2(s,pos1,pos2)
if(pos1 >=1 && pos2 >= pos1 && pos2 <= numel(s)) c=s(pos1:pos2);
else c='';
end
end % substr2
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我为函数调用长度超过2个字符的字符串时,s1总是计算字符串中的第二个字符,例如'CM's1 = M,s2 = M.

如果我在这个函数之外调用substr1函数,它工作正常(例如返回字符串中的第一个字符).

我想知道我的算法/语法是否有问题,如果你能提供帮助的话?

非常感激.

Den*_*din 7

这是@Robert启发的答案,但却截然不同:

myStr = 'MCMLXXXVIII';

key = 'MDCLXVI';
values = [1000, 500,100,50,10,5,1];

% Calculate the 'weight' of each letter
[~, loc]=ismember(myStr,key)    
relevantValues = values(loc);

% Determine whether we should substract or add
s = [-sign(diff(relevantValues)), 1];
%% To avoid zeros in s    
while ~all(s)
   f = find(s == 0);
   s(f) = s(f+1);
end

s*relevantValues'
Run Code Online (Sandbox Code Playgroud)

这种向量化方法可以最大限度地减少字符串操作的数量并避免eval语句.