对于计算机科学作业,我的目标是将字符串(罗马数字)转换为整数.我要在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函数,它工作正常(例如返回字符串中的第一个字符).
我想知道我的算法/语法是否有问题,如果你能提供帮助的话?
非常感激.
这是@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
语句.
归档时间: |
|
查看次数: |
2311 次 |
最近记录: |