【问题标题】:project euler 22 using c#使用 C# 项目 euler 22
【发布时间】:2013-07-28 16:25:43
【问题描述】:

我正在解决与Project Euler #22 Python, 2205 points missing? 相同的问题,但我使用的是 C#。我找不到错误。这是我的代码:

class Program
{
    static List<string> pole;

    static string SaveName(StreamReader reader)
    {
        int znak = reader.Read();
        string jmeno = "";

        while ((znak < 'A') || (znak > 'Z'))
        {
            znak = reader.Read();
        }

        while (znak != ',')
        {
            jmeno = jmeno + (char) znak;
            znak = reader.Read();
            if (znak == 34) break;
        }

        return jmeno;

    }

    static void SaveNamesIntoList()
    {
        StreamReader reader = new StreamReader(@"../../../names.txt");

        while (reader.Read() != ';')
        {
            pole.Add(SaveName(reader));
        }
    }

    static void Main(string[] args)
    {
        pole = new List<string>();
        SaveNamesIntoList();
        pole.Sort();

        int sum = 0;
        int sum_word = 0;
        string name = "";

        for (int i = 0; i < pole.Count; i++)
        {
            name = pole[i];
            sum_word = 0;

            for (int u = 0; u < name.Length; u++)
            {
                sum_word += (name[u] - 'A' + 1);
            }

            sum += (sum_word * (i+1));
        }

        Console.WriteLine(sum);
    }
}

感谢您的任何回答:)

【问题讨论】:

  • 您在哪里按字母顺序对列表进行排序?
  • 带有pole.Sort()的行;在 Main 方法中(就在 SaveNamesToList 之后)不知何故消失了,但这不是问题 :)

标签: c#


【解决方案1】:

你得到不同结果的另一个原因是捷克语有特定的字母“CH”在“H”之后,所以在不使用正确文化的情况下按字母顺序排列,你可以有这样的东西

aaa
bbb
ccc
czz
ddd
cha

【讨论】:

    【解决方案2】:

    这里有几个问题。您无需检查阅读器是否到达流的末尾 - 您必须检查 Read 是否返回 -1。如果是这样 - 这是文件的结尾。最重要的是,您不会处置阅读器...

    然后,正如 Cedric 在 cmets 中指出的那样,您并没有真正对列表进行排序,因此即使将其更改为结果也是错误的:

     using (var reader = new StreamReader("names.txt"))
     {
          while (reader.Read() != -1)
          {
              pole.Add(SaveName(reader));
          }
     }
    

    你需要做的是添加这一行(这通常有点浪费,但我会在几秒钟内完成):

    pole = pole.OrderBy(x => x).ToList(); //<<----- this one
    for (int i = 0; i < pole.Count; i++)
    {
          name = pole[i];
          sum_word = 0;
    
          for (int u = 0; u < name.Length; u++)
          {
              sum_word += (name[u] - 'A' + 1);
          }
    
          sum2 += (sum_word*(i + 1));
     }
    

    结果是871198282,应该是正确的 - 至少人们在链接的问题中是这么说的。

    即便如此,我能否建议一种更简单的方法来解决整个问题:

    var scores = Enumerable.Range('A', 'Z' - 'A' + 1)
                           .Select((i, ch) => new { Character = (char) i, Weight = ch + 1 })
                           .ToDictionary(key => key.Character, val => val.Weight);
    
    var sum = File.ReadAllText("names.txt")
                              .Split(',')
                              .Select(x => x.Trim('"'))
                              .OrderBy(x => x)
                              .Select((x, i) => (i + 1)*x.Select(y => scores[y]).Sum())
                              .Sum();
    

    【讨论】:

    • 嗨,谢谢,正如我回复 Cedric 的时候,pole.Sort();就在方法 SaveNameToList(); 之后不知何故消失了,所以现在考虑一下,它就在那里。我在文件末尾添加了“;”(分号),以便我可以测试我是否已经完成了文件的读取。但也有了所有这些东西,我得到的结果是 872262771 而不是正确的......:/
    • @arahusky 好吧,我介绍的带有“修复”的代码给了我与我的方法相同的结果,即 871198282...
    • 好的,谢谢:),那么我不知道问题出在哪里。也许在 VS 工作室 :D :)
    【解决方案3】:

    这是一个使用 Linq 的版本。

    void Main()
    {
        var file = @"C:\...location.of.file...\p022_names.txt";
        using (var reader = new StreamReader(file, Encoding.UTF8))
        {
            NameScore(reader.ReadToEnd().Replace("\"",string.Empty).Split(new[]{','})).Dump();  
        }
    }
    
    private long NameScore(string[] names)
    {
        return names.OrderBy(o => o)
                    .Select((l, i) => { return l.ToUpper().ToCharArray().Sum(s => (int)s - 64) * (i + 1);})
                    .Sum(s => s);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 2012-11-10
      相关资源
      最近更新 更多