492 views (last 30 days)

John
on 20 Sep 2014

Edited: John
on 20 Sep 2014

When you say you do not want the number to turn to a scalar, I think what you are saying is you don't want to convert the scalar number x = 1994 into a vector v = [1 9 9 4].

If you are allowed to use string functions and are loose on your restriction, consider this:

x = 1994

%Convert x = 1994 to a vector of characters

a = num2str(x); %a now holds ['1' '9' '9' '4']

%Go through each of the elements in the vector, a, convert them to numbers and add them up

sum = 0;

for i = 1:size(a, 2)

sum = sum + str2num(a(i));

end

%sum now contains the sum of the individual digits

But this seems like a typical undergraduate homework problem :-) for a comp. sci./electrical enginering course :-) and the string approach above is unlikely to be the proper solution. I hope no one else provides the mathematical solution to this :-) as this is not a MATLAB question.

As a hint, consider the significance of the position of the individual digits in the number. We call them the one's, ten's, hundred's, and thousand's position for a reason :-)

John
on 20 Sep 2014

A glimpse from the mathematical vantage point:

x = 1994;

a = 1994 / 1000;

a = floor(a); %a = 1, ..cough.. the thousand's position

b = x - a * 1000; % b = 994

b = b / 100;

b = floor(b); % b = 9, ..cough.. the hundred's position

None of the variables above are vectors.

per isakson
on 20 Sep 2014

Edited: per isakson
on 20 Sep 2014

A one-liner with a lot of Matlab

>> sum( arrayfun( @(a) str2double(a), num2str( 1994 ) ) )

ans =

23

or even more matlab-ish

>> sum( arrayfun( @str2double, num2str( 1994 ) ) )

ans =

23

This is essential the same as John's solution with the for-loop replaced by the function, arrayfun

per isakson
on 20 Sep 2014

Jan
on 11 Jul 2019

Edited: Jan
on 11 Jul 2019

N = 1994;

m = floor(log10(N));

D = mod(floor(N ./ 10 .^ (m:-1:0)), 10);

>> D = [1, 9, 9, 4]

John D'Errico
on 9 Oct 2020

@Tejas Mahajan - easy enough. But you should make the effort yourself. What, for example does this do?

10 .^ (m:-1:0)

Now, what would happen when you do this?

N ./ 10 .^ (m:-1:0)

Now add one more layer around that?

floor(N ./ 10 .^ (m:-1:0))

Try that part for 1994. Now, look at the last step in his code.

mod(floor(N ./ 10 .^ (m:-1:0)), 10);

What did that do?

When you don't understand a piece of code, break it apart. Start in the middle, then work outwards, one part at a time until you do see what it does. You won't learn otherwise.

Joachim Posselt
on 12 Apr 2017

Edited: Joachim Posselt
on 12 Apr 2017

yyyy = 1994;

% dig = digits extract // Ziffern extrahieren - mit Mathe, nicht mit Strings!!

dig_t = floor (yyyy / 1000); % tausender // thousands

dig_h = yyyy - dig_t * 1000;

dig_h = floor (dig_h / 100); % hunderter // hundreds

dig_z = yyyy - dig_t * 1000 - dig_h*100;

dig_z = floor (dig_z / 10); % zehner // ten

dig_e = yyyy - dig_t * 1000 - dig_h*100 -dig_z*10;

dig_e = floor (dig_e / 1); % einer // ones

Opportunities for recent engineering grads.

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

Start Hunting!
## 0 Comments

Sign in to comment.