欧拉计划问题十七matlab实现

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(手算的)

小结 :

          翻译的时候那个格式不是很对,应该是字符串连接方式的问题,这就是解题的关键了,等我再研究研究,等我弄出来在更新喽!大家帮忙看看,有什么地方需要改改,共同交流一下!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值