2015-11-18 60 views
-2

所以我现在要通过项目欧拉我对问题17问题是项目欧拉任务17

如果数字1至5字写得出来:一,二,三,四,五,那么总共有3 + 3 + 5 + 4 + 4 = 19个字母。

如果所有从1到1000(单万)的数字包容性话写出来,多少个字母,会使用吗?

我个人,虽然这个问题将是非常直截了当。现在,我知道我的代码不是最优化的,我知道我可以在网络上找到解决方案。但我只是在寻找我的代码出了什么问题。我得到的答案是21224,而正确答案是21124.

int Sum = 0; 
    int Hundred; 
    int Ten; 
    int One; 
    void Count() 
    { 
     for(int i = 0; i < 10; i++) 
     { 
      Hundred = i; 
      for(int j = 0; j < 10; j++) 
      { 
       Ten = j; 
       for(int k = 0; k < 10; k++) 
       { 
        One = k; 
        switch(i) 
        { 
         case 0: 
          Tens(); 
          break; 
         case 1: 
          Sum += 3; 
          Sum += 7; 
          Tens(); 
          break; 
         case 2: 
          Sum += 3; 
          Sum += 7; 
          Tens(); 
          break; 
         case 3: 
          Sum += 5; 
          Sum += 7; 
          Tens(); 
          break; 
         case 4: 
          Sum += 4; 
          Sum += 7; 
          Tens(); 
          break; 
         case 5: 
          Sum += 4; 
          Sum += 7; 
          Tens(); 
          break; 
         case 6: 
          Sum += 3; 
          Sum += 7; 
          Tens(); 
          break; 
         case 7: 
          Sum += 5; 
          Sum += 7; 
          Tens(); 
          break; 
         case 8: 
          Sum += 5; 
          Sum += 7; 
          Tens(); 
          break; 
         case 9: 
          Sum += 4; 
          Sum += 7; 
          Tens(); 
          break; 
        } 

       } 
      } 
     } 

     Sum += 11 + 99*9*3; //Taking into account the "one thousand" and the "and"s 
     label1.Text = Sum.ToString(); 
    } 
    void Tens() 
    { 
     switch (Ten) 
     { 
      case 0: 
       Ones(); 
       break; 
      case 1: 
       switch (One) 
       { 
        case 0: 
         Sum += 3; 

         break; 
        case 1: 
         Sum += 6; 

         break; 
        case 2: 
         Sum += 6; 

         break; 
        case 3: 
         Sum += 8; 

         break; 
        case 4: 
         Sum += 8; 

         break; 
        case 5: 
         Sum += 7; 

         break; 
        case 6: 
         Sum += 7; 

         break; 
        case 7: 
         Sum += 9; 

         break; 
        case 8: 
         Sum += 8; 

         break; 
        case 9: 
         Sum += 8; 

         break; 
       } 
       break; 
      case 2: 
       Sum += 6; 
       Ones(); 
       break; 
      case 3: 
       Sum += 6; 
       Ones(); 
       break; 
      case 4: 
       Sum += 6; 
       Ones(); 
       break; 
      case 5: 
       Sum += 5; 
       Ones(); 
       break; 
      case 6: 
       Sum += 5; 
       Ones(); 
       break; 
      case 7: 
       Sum += 7; 
       Ones(); 
       break; 
      case 8: 
       Sum += 6; 
       Ones(); 
       break; 
      case 9: 
       Sum += 6; 
       Ones(); 
       break; 
     } 
    } 

    void Ones() 
    { 
     switch(One) 
     { 
      case 0: 

       break; 
      case 1: 
       Sum += 3; 

       break; 
      case 2: 
       Sum += 3; 

       break; 
      case 3: 
       Sum += 5; 

       break; 
      case 4: 
       Sum += 4; 

       break; 
      case 5: 
       Sum += 4; 

       break; 
      case 6: 
       Sum += 3; 

       break; 
      case 7: 
       Sum += 5; 

       break; 
      case 8: 
       Sum += 5; 

       break; 
      case 9: 
       Sum += 4; 

       break; 
     } 
    } 

回答

0

“四十”是由5个字母,但在你的Tens方法你有

case 4: 
    Sum += 6; 
    Ones(); 
    break; 

和“四十”将出现100次,所以有区别。

我个人认为这将是更好的有一个映射位的字母,而不是用一堆开关病例数阵列。我就是这么做的,我只是仔细检查自己的价值观以找到错误。像

var onesDigit = new[] { 0, 3, 3, 5, 4, 4, 3, 5, 5, 4 }; 
var teens = new[] { 3, 6, 6, 8, 8, 7, 7, 9, 8, 8 }; 
var tensDigit = new[] { 0, 0, 6, 6, 5, 5, 5, 7, 6, 6 }; 

而且onesDigit东西可以与数百+ 7单词“百强”中重复使用。