数字字母计数 问题17 如果将1到5的数字写成单词:1、2、3、4、5,则总共使用了3 + 3 + 5 + 4 + 4 = 19个字母。
如果所有1到1000(含1000)之间的数字都用文字写出,那么将使用多少个字母?
注意:请勿计算空格或连字符。例如,342(三百四十二)包含23个字母,而115(一百一十五)包含20个字母。写数字时使用“和”符合英国的用法。
试图将一些数字与它们都匹配的字符串进行比较。
using System;
using System.Collections.Generic;
public class Program
{
static int n = 1000;
static List<int> letterCountCache = new List<int>();
public static void Main()
{
long t = 0;
letterCountCache.Add(0);
for (int i = 1; i <= n; i ++)
{
letterCountCache.Add(GetLetterCount(i));
t += letterCountCache[i];
}
Console.WriteLine(t);
Console.WriteLine(letterCountCache[70] + " " + "seventy".Length);
}
static int GetLetterCount(int i)
{
if (letterCountCache.Count > i)
return letterCountCache[i];
switch (i)
{
case 1:
return "one".Length;
case 2:
return "two".Length;
case 3:
return "three".Length;
case 4:
return "four".Length;
case 5:
return "five".Length;
case 6:
return "six".Length;
case 7:
return "seven".Length;
case 8:
return "eight".Length;
case 9:
return "nine".Length;
case 10:
return "ten".Length;
case 11:
return "eleven".Length;
case 12:
return "twelve".Length;
case 13:
return "thirteen".Length;
case 14:
return "fourteen".Length;
case 15:
return "fifteen".Length;
case 16:
return "sixteen".Length;
case 17:
return "seventeen".Length;
case 18:
return "eighteen".Length;
case 19:
return "nineteen".Length;
}
if (i >=20 && i <=29)
return "twenty".Length + GetLetterCount(i % 10);
if (i >=30 && i <=39)
return "thirty".Length + GetLetterCount(i % 10);
if (i >= 40 && i <= 49)
return "forty".Length + GetLetterCount(i % 10);
if (i >=50 && i <= 59)
return "fifty".Length + GetLetterCount(i % 10);
if (i > 80 && i < 89)
return "eighty".Length + GetLetterCount(i % 10);
if (i >= 60 && i <= 99)
return GetLetterCount(i % 10) + "ty".Length + GetLetterCount(i / 10);
if (i == 1000)
return "onethousand".Length;
if (i % 100 == 0)
return GetLetterCount(i / 100) + "hundred".Length;
return GetLetterCount(i / 100) + "hundred".Length + "and".Length + GetLetterCount(i % 100);
}
}
正确的结果显然是21124。我的回报是21144。有人知道为什么吗?
答案 0 :(得分:8)
缺少平等的情况如下:
if (i >= 80 && i <= 89)
return "eighty".Length + GetLetterCount(i % 10);