我在使用Project Euler的Problem 22
时遇到了麻烦使用names.txt(右键单击和“保存链接/目标为...”),一个包含超过五千个名字的46K文本文件,首先按字母顺序排序。然后计算每个名称的字母值,将该值乘以列表中的字母位置以获得名称分数。
例如,当列表按字母顺序排序时,值为3 + 15 + 12 + 9 + 14 = 53的COLIN是列表中的第938个名称。因此,COLIN将获得938×53 = 49714的分数。 文件中所有名称分数的总和是多少?
到目前为止,这是我自己无法解决的第一个欧拉问题,我不知道我在这里做错了什么。用这个解决方案,我将在1532年前完成。
这是我的代码:
using (WebClient client = new WebClient())
{
try
{
tempString = client
.DownloadString("http://projecteuler.net/project/resources/p022_names.txt")
.Replace("\"", "");
}
catch (Exception)
{
MessageBox.Show("Error, check your internet connection!");
}
}
string[] names = tempString.Split(',');
Array.Sort(names);
int total = 0;
for (int i = 0; i < names.Length; i++)
{
int namescore = 0;
foreach (char c in names[i]) { namescore += (int)c - 64; }
total += namescore * (i + 1);
}
return total.ToString();
我认为它可能是C#特定的错误或怪癖?
答案 0 :(得分:1)
如您所述,您无法设置CurrentCulture
,因此请设置DefaultThreadCurrentCulture
。
当我使用
时CultureInfo.DefaultThreadCurrentCulture = CultureInfo.GetCultureInfo("hr-HR");
在采取任何行动之前,我得到了相同的结果。所以,显然,你应该使用
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.GetCultureInfo("en-US");
实现预期的输出(除了评论中提到的它在ToString()
方法中不足以执行此操作,因为它也会影响排序)。
答案 1 :(得分:0)
好的,让我们一步一步地检查,找出不一致的地方。我有正确的答案。
初始数据:
names.Length == 5163
names.Count(w=>!Regex.IsMatch(w,"^[A-Z]+$")) == 0
names.Sum(w=>w.Length) == 30959
部分总和(在N
元素之后):
500: 7139561
2500: 187773540
5000: 811204450
更新:
我有一个想法:Sort
是特定于语言环境的!试试Sort(StringComparison.Ordinal)
。
UPDATE2:
要将文化,set thread culture or AppDomain culture切换为CultureInfo("en-US")
。