Problem with straightforward problem - Can you help?

My code is as follows. It doesn't return the right answer. For 1556 it returns "XI". Its supposed to return "XVI" for the century number for 1556. The code is straightforward, but it doesn't work. What is wrong? Is it a matter of function dominance and putting parentheses into the code to correct? The math hierarchy?
function [ out] = centuries( year )
%CENTURIES Summary of this function goes here
% Detailed explanation goes here
YEAR=num2str(year);
l = length(YEAR);
if l ==4
A = YEAR(1);
B = YEAR(2);
C=YEAR(3);
D=YEAR(4);
if A=='1' && B =='0' && C~=0 || D~=0
out ='XI';
return;
end
if A=='1' && B =='0' && C==0 && D==0
out ='X';
return;
end
if A=='1' && B =='1' && C~=0 || D~=0
out ='XII';
return;
end
if A=='1' && B =='1' && C==0 && D==0
out ='XI';
return;
end
if A=='1' && B =='2' && C~=0 || D~=0
out ='XIII';
return;
end
if A=='1' && B =='2' && C==0 && D==0
out ='XII';
return;
end
if A=='1' && B =='3' && C~=0 || D~=0
out ='XIII';
return;
end
if A=='1' && B =='3' && C==0 && D==0
out ='XII';
return;
end
if A=='1' && B =='4' && C~=0 || D~=0
out ='XV';
return;
end
if A=='1' && B =='4' && C==0 && D==0
out ='XIV';
return;
end
if A=='1' && B =='5' && C~=0 || D~=0
out ='XVI';
return;
end
if A=='1' && B =='5' && C==0 && D==0
out ='XV';
return;
end
if A=='1' && B =='6' && C~=0 || D~=0
out ='XVII';
return;
end
if A=='1' && B =='6' && C==0 && D==0
out ='XVI';
return;
end
if A=='1' && B =='7' && C~=0 || D~=0
out ='XVIII';
return;
end
if A=='1' && B =='7' && C==0 && D==0
out ='XVII';
return;
end
if A=='1' && B =='8' && C~=0 || D~=0
out ='XIX';
return;
end
if A=='1' && B =='8' && C==0 && D==0
out ='XVIII';
return;
end
if A=='1' && B =='9' && C~=0 || D~=0
out ='XX';
return;
end
if A=='1' && B =='9' && C==0 && D==0
out ='XVIII';
return;
end
if A=='2' && B =='0' && C~=0 || D~=0
out ='XXI';
return;
end
if A=='2' && B =='0' && C==0 && D==0
out ='XX';
return;
end
if A=='2' && B =='1' && C~=0 || D~=0
out ='XXII';
return;
end
if A=='2' && B =='1' && C==0 && D==0
out ='XXI';
return;
end
if A=='2' && B =='2' && C~=0 || D~=0
out ='XXIII';
return;
end
if A=='2' && B =='2' && C==0 && D==0
out ='XXII';
return;
end
if A=='2' && B =='3' && C~=0 || D~=0
out ='XXIV';
return;
end
if A=='2' && B =='3' && C==0 && D==0
out ='XXIII';
return;
end
if A=='2' && B =='4' && C~=0 || D~=0
out ='XXV';
return;
end
if A=='2' && B =='4' && C==0 && D==0
out ='XXIV';
return;
end
if A=='2' && B =='5' && C~=0 || D~=0
out ='XXVI';
return;
end
if A=='2' && B =='5' && C==0 && D==0
out ='XXIV';
return;
end
if A=='2' && B =='6' && C~=0 || D~=0
out ='XXVII';
return;
end
if A=='2' && B =='6' && C==0 && D==0
out ='XXVI';
return;
end
if A=='2' && B =='7' && C~=0 || D~=0
out ='XXVIII';
return;
end
if A=='2' && B =='7' && C==0 && D==0
out ='XXVI';
return;
end
if A=='2' && B =='8' && C~=0 || D~=0
out ='XXIX';
return;
end
if A=='2' && B =='8' && C==0 && D==0
out ='XXVIII';
return;
end
if A=='2' && B =='9' && C~=0 || D~=0
out ='XXX';
return;
end
if A=='2' && B =='9' && C==0 && D==0
out ='XXIX';
return;
end
if A=='3' && B =='0' && C~=0 || D~=0
out ='XXXI';
return;
end
if A=='3' && B =='0' && C==0 && D==0
out = 'XXIX';
return;
end
end
if l==3
A = YEAR(1);
B = YEAR(2);
C=YEAR(3);
if A =='1' && C ~='0' || B ~='0'
out='II';
return;
end
if A=='1' && C =='0' && B=='0'
out ='I';
return;
end
if A =='2' && C ~='0' || B ~='0'
out='III';
return;
end
if A=='2' && C =='0' && B=='0'
out ='II';
return;
end
if A =='3' && C ~='0' || B ~='0'
out='IV';
return;
end
if A=='3' && C =='0' && B=='0'
out ='III';
return;
end
if A =='4' && C ~='0' || B ~='0'
out='V';
return;
end
if A=='4' && C =='0' && B=='0'
out ='IV';
return;
end
if A =='5' && C ~='0' && B ~='0'
out='VI';
return;
end
if A=='5' && C =='0' && B=='0'
out ='V';
return;
end
if A =='6' && C ~='0' || B ~='0'
out='VII';
return;
end
if A=='6' && C =='0' && B=='0'
out ='VI';
return;
end
if A =='7' && C ~='0' || B ~='0'
out='IIX';
return;
end
if A =='7' && C =='0' && B =='0'
out='VII';
return;
end
if A=='8' && C ~='0' || B~='0'
out ='IX';
return;
end
if A=='8' && C =='0' && B=='0'
out ='VIII';
return;
end
if A=='9' && C ~='0' || B~='0'
out ='X';
return;
end
if A=='9' && C =='0' && B=='0'
out ='IX';
return;
end
end
if l <3
out ='I';
return;
end
end

2 Commenti

You have ignored the fact that all operators are evaluated in a specific, well defined order. The order is defined here:
Once you learn about operator precedence, then think about what you really want to happen when you write something like this:
if A=='1' && B =='0' && C~=0 || D~=0
Also note that your solution of writing an explicit line of code for every possible output and using a thousand if statements is highly inefficient to write, and is also liable to make the buggy. Exactly as per one of your earlier tasks
you should think about how to encode the patterns of the task and this will make your code much simpler and easier to write and check. Do some research.
Ahh, but I'm done, and the code works and is found to be correct by the software that checks it.

Accedi per commentare.

Risposte (1)

James Tursa
James Tursa il 15 Dic 2016
Modificato: Walter Roberson il 15 Dic 2016
Use parentheses to separate your operations from your && operations as necessary. E.g., this line
if A=='1' && B =='0' && C~=0 || D~=0
As written, since && is higher operator precedence than ||, this is equivalent to:
if ( A=='1' && B =='0' && C~=0) || D~=0
I am guessing you really want this logic:
if A=='1' && B =='0' && ( C~=0 || D~=0 )
Similarly for all the other lines as well depending on what you really want the logic to do.

2 Commenti

I also need quotation marks around the zeroes....
Yes ... that too!

Accedi per commentare.

Categorie

Scopri di più su Mathematics in Centro assistenza e File Exchange

Richiesto:

il 15 Dic 2016

Commentato:

il 16 Dic 2016

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by