C# 使用c语言创建euler 22项目#

C# 使用c语言创建euler 22项目#,c#,C#,我正在解决与这里相同的问题,但我正在使用C。我找不到错误。这是我的密码: class Program { static List<string> pole; static string SaveName(StreamReader reader) { int znak = reader.Read(); string jmeno = ""; while ((znak < 'A') || (znak >

我正在解决与这里相同的问题,但我正在使用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);
    }
}
类程序
{
静态列表极;
静态字符串存储名(StreamReader)
{
int znak=reader.Read();
字符串jmeno=“”;
而((znak<'A')| |(znak>'Z'))
{
znak=reader.Read();
}
而(znak!=',')
{
jmeno=jmeno+(char)znak;
znak=reader.Read();
如果(znak==34)中断;
}
返回jmeno;
}
静态void SaveNamesIntoList()
{
StreamReader=新的StreamReader(@../../../../names.txt”);
while(reader.Read()!=';')
{
添加(保存名称(读卡器));
}
}
静态void Main(字符串[]参数)
{
极点=新列表();
SaveNamesIntoList();
pole.Sort();
整数和=0;
int sum_word=0;
字符串名称=”;
for(int i=0;i

谢谢你的回答:)

这里有一些问题。您不需要检查读卡器是否到达流的末尾-您必须检查
读卡器是否返回-1。如果有,那就是文件的结尾。除此之外,你不需要处理阅读器

然后,正如Cedric在评论中指出的,您还没有对列表进行真正的排序,因此即使将其更改为:

 using (var reader = new StreamReader("names.txt"))
 {
      while (reader.Read() != -1)
      {
          pole.Add(SaveName(reader));
      }
 }
您需要做的是添加这一行(一般来说这有点浪费,但我会在一秒钟内完成):


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

aaa
bbb
ccc
czz
ddd
cha

这里有一个使用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);
}

在哪里按字母顺序对列表进行排序?带有pole.sort()的行;在Main方法中(就在SaveNamesToList之后)不知怎么地被排除了,但这不是问题:)您好,谢谢,正如我回答Cedric时所说的,这是一行pole.Sort();方法SaveNameToList()之后;不知何故消失了,所以现在想想,它就在那里。我在文件的末尾添加了“;”(分号),以便测试我是否已经完成了文件的读取。但是还有这些东西,我得到的结果是872262771,而不是正确的结果…:/@arahusky好吧,你的代码和我介绍的“修复程序”给了我与我的方法相同的结果,即871198282…好的,谢谢:),那么我不知道问题出在哪里。也许在VS演播室:D:)
aaa
bbb
ccc
czz
ddd
cha
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);
}