项目欧拉(#17)

时间:2011-10-30 10:51:03

标签: c++

关于项目欧拉的问题17:

如果数字1到5用文字写出:一,二,三,四,五,则总共使用3 + 3 + 5 + 4 + 4 = 19个字母。 如果所有1到1000(一千)的数字都用文字写出来,会用多少个字母? 注意:不要计算空格或连字符。例如,342(三百四十二)包含23个字母,115(一百一十五)包含20个字母。在写出数字时使用“和”符合英国的用法。

我已多次查看我的代码,无法找到原因,为什么它没有正确解决,任何帮助都会非常感谢,谢谢

`#include <iostream>
#include <sstream>

unsigned int value = 11;//one thousand = 11

short small(short x);
void two(short third);

int main()
{
    for(short count = 0;count<10;count++)
    {
        two(count);
    }
   std::cout<<value;
    std::cin.get();
    return 0;
}

void two(short third)
{

    std::string temp;
    if(third>0)
    {
         third = (small(third) + 10);//10 = and(3) + hundred(7)
    }
    for(short i = 0;i<20;i++)//0-20
    {   
        value += (small(i) + third);      
    }
    for(short i = 20;i<60;i++)//20-40 + 80-100
    {
         std::stringstream ss;
         ss<<i;
         temp = ss.str();
         value += ((small(temp[1]-'0') + 6) + third);
    }
    for(short i = 40;i<70;i++)//40-70
    {
         std::stringstream ss;
         ss<<i;
         temp = ss.str();
         value += ((small(temp[1]-'0') + 5) + third);
    }
    for(short i = 70;i<80;i++)//70-80
    {
         std::stringstream ss;
         ss<<i;
         temp = ss.str();
         value += ((small(temp[1]-'0') + 7) + third);
    }      
}

short small(short x)
{
              switch(x)
             {
                case 0:
                     return 0;
                case 1:
                     return 3;
                case 2:  
                     return 3;
                case 3:
                     return 5;
                case 4:
                     return 4;
                case 5:
                     return 4;
                case 6:
                     return 3;
                case 7:
                     return 5;
                case 8:
                     return 5;
                case 9:
                     return 4;
                case 10:
                     return 3;
                case 11:
                     return 6;
                case 12:
                     return 6;
                case 13:
                     return 8;
                case 14:
                     return 8;
                case 15:
                     return 7;
                case 16:
                     return 7;
                case 17:
                     return 9;
                case 18:
                     return 8;
                case 19:
                     return 8;                   
          }
}

2 个答案:

答案 0 :(得分:1)

你的第一个错误是

ss.str() = "";

并不代表你的想法。您应该在每个循环中打印temp,以检查您是否正在添加您认为要添加到value的内容。

然后你应该简化问题:检查你的程序是否正在生成并向value添加适当数量的1到10,1到20,1到100,1到110等等。你会发现如果它是有条理的,那么你可以更容易地调试你的程序,以便你可以要求任何1到 n 的总和 - 对于命令行上给出的 n ,例如。

答案 1 :(得分:1)

首先你需要考虑John Mashall的答案。使用字符串的解决方案不是最佳的,您可以考虑使用模数10来提取第二个数字。

你没有添加数百100,200,300,400,...你正确地添加101,102,...但不是数百。在您的代码中添加初始和百(10个字符),您还应该添加(7)(以及一,二,你,...)的长度价值:

if(third>0)
{
     third = (small(third) + 10);//10 = and(3) + hundred(7)
     value += third - 3; // no need for the "and"
}

如果我应用John Marshalls修复(使用模数代替)并应用上面的内容,我会得到正确的结果(将鼠标悬停在下面的框上以查看结果):

  

21124