language: C# (mono-2.8)
date: 657 days 11 hours ago
link:
visibility: public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace WordNumbers
{
    class Program
    {
        static string[] sOnes =
        { "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
        static string[] sTens =
        { "", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };
        static string[] sTeens =
        { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
 
        static int[] sOnesLengths = (from x in sOnes select x.Length).ToArray();
        static int[] sTensLengths = (from x in sTens select x.Length).ToArray();
        static int[] sTeensLengths = (from x in sTeens select x.Length).ToArray();
 
        static string Wordify(long n)
        {
            if (n < 10) return sOnes[n];
            else if (n < 20) return sTeens[n - 10];
            else if (n < 100) return sTens[n / 10] + Wordify(n % 10);
            else if (n < 1000) return Wordify(n / 100) + "hundred" + Wordify(n % 100);
            else if (n < 1000000) return Wordify(n / 1000) + "thousand" + Wordify(n % 1000);
            else if (n < 1000000000) return Wordify(n / 1000000) + "million" + Wordify(n % 1000000);
 
            throw new ArgumentException();
        }
 
        static int WordiLength(long n)
        {
            if (n < 10) return sOnesLengths[n];
            else if (n < 20) return sTeensLengths[n - 10];
            else if (n < 100) return sTensLengths[n / 10] + WordiLength(n % 10);
            else if (n < 1000) return WordiLength(n / 100) + 7 + WordiLength(n % 100);
            else if (n < 1000000) return WordiLength(n / 1000) + 8 + WordiLength(n % 1000);
            else if (n < 1000000000) return WordiLength(n / 1000000) + 7 + WordiLength(n % 1000000);
 
            throw new ArgumentException();
        }
 
        static void Main(string[] args)
        {
            long sumNum = 0;
            long sumLen = 0;
 
            long target = 51000000000;
            long i = 1;
 
            var start = DateTime.Now;
 
            for (; i < 999999999; i++)
            {
                long newLength = sumLen + WordiLength(i);
                if (newLength >= target)
                    break;
 
                sumNum += i;
                sumLen = newLength;
            }
 
            var spent = DateTime.Now - start;
            Console.WriteLine(spent.ToString());
 
            Console.WriteLine(sumNum);
            Console.WriteLine(Wordify(i)[Convert.ToInt32(target - sumLen - 1)]);
        }
    }
}