Problem 17 :Number letter counts
If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.
If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?
NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.
思路 :
分类计算:
- 1到20字母拼写无规律,直接算。
- 接下来从20-100,数字字母组合为从20开始,并且是10的倍数的数后面加1到9的组合。
- 从100 -1000,同理,只不过加了hundred, and,其他的与前面类似。
我的想法就是先写一个翻译函数,就是给你一个数字,然后你把数字翻译成英语单词,英语单词是字符串形式的,可以计算出每个英语单词的字符串长度,最后加和。
在此之前,我手算出了答案,很有规律的,很好算!
代码 :
将数字翻译成英语函数的代码:
function t = num2words(i)
%i = input('');
if i > 0 && i < 20
A = [{'one'},{'two'},{'three'},{'four'},{'five'},{'six'},{'seven'},{'eight'},{'nine'},{'ten'},{'eleven'},{'twelve'},{'thirteen'},{'fourteen'},{'fifteen'},{'sixteen'},{'seventeen'},{'eighteen'},{'nineteen'}];
t = char(A(i));
% disp(t);
end
if i >= 20 && i <= 100
A = [{'one'},{'two'},{'three'},{'four'},{'five'},{'six'},{'seven'},{'eight'},{'nine'},{'ten'},{'eleven'},{'twelve'},{'thirteen'},{'fourteen'},{'fifteen'},{'sixteen'},{'seventeen'},{'eighteen'},{'nineteen'}];
B = [{'ten'},{'twenty'},{'thirty'},{'forty'},{'fifty'},{'sixty'},{'seventy'},{'eighty'},{'ninety'},{'hundred'}];
k = floor(i/10); %first
k1 = mod(i,10); %second
if k1 == 0
k1 = floor(i/10);
t = char(B(k1));
return
else
t2 = char(B(k));%
t3 = char(A(k1));
c = 9;
t = strcat(t2,c,t3);
% disp(t4);
end
end
if i > 100 && i <= 1000
A = [{'one'},{'two'},{'three'},{'four'},{'five'},{'six'},{'seven'},{'eight'},{'nine'},{'ten'},{'eleven'},{'twelve'},{'thirteen'},{'fourteen'},{'fifteen'},{'sixteen'},{'seventeen'},{'eighteen'},{'nineteen'}];
B = [{'ten'},{'twenty'},{'thirty'},{'forty'},{'fifty'},{'sixty'},{'seventy'},{'eighty'},{'ninety'},{'hundred'},{'thousand'}];
k1 = floor(i/100); %first
if k1 == 10
disp(B(11));
return
end
k2 = floor((i-k1*100)/10);
if k2 == 0
k3 = mod((i-k1*100),10);
t2 = char(A(k1));
t3 = char(B(10));
t4 = 'and';
t5 = char(A(k3));
c = 9;
t = strcat(t2,c,t3,c,t4,c,t5);
% disp(t6);
elseif k2 == 1
k3 = mod((i-k1*100),100);
t2 = char(A(k1));%first
t3 = char(B(10));%second
t4 = 'and';
t5 = char(A(k3));
c = 9;
t = strcat(t2,c,t3,c,t4,c,t5);
% disp(t);
else
k3 = mod((i-k1*100),10);
t2 = char(A(k1));%first
t3 = char(B(10));%second
t4 = 'and';
if k3 == 0
k3 = floor((i-k1*100)/10);
t5 = char(B(k3));
c = 9;
t = strcat(t2,c,t3,c,t4,c,t5);
return
else
t5 = char(B(k2));
t6 = char(A(k3));
c = 9;
t = strcat(t2,c,t3,c,t4,c,t5,c,t6);
% disp(t);
end
end
end
调用方式很简单,举个例子:
计算字符串长度的的代码:
s = 0;
for i = 1:1000
s(i) = length(num2words(i));
s = s + s(i);
end
s
这个代码没跑出来,有报错,哪位大神能帮忙看看?
结果 :21124(手算的)
小结 :
翻译的时候那个格式不是很对,应该是字符串连接方式的问题,这就是解题的关键了,等我再研究研究,等我弄出来在更新喽!大家帮忙看看,有什么地方需要改改,共同交流一下!